AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsCrowdControlled () const
 
bool IsImmobilizedState () const
 
void SetAnimTier (AnimTier animTier)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
bool IsClientControlled (Player const *exactClient=nullptr) const
 
Player const * GetClientControlling () const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual void SetDualWieldMode (DualWieldMode mode)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (WeaponAttackType attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatFlatModifier (UnitMods unitMod, UnitModifierFlatType modifierType, float amount, bool apply)
 
void ApplyStatPctModifier (UnitMods unitMod, UnitModifierPctType modifierType, float amount)
 
void SetStatFlatModifier (UnitMods unitMod, UnitModifierFlatType modifierType, float val)
 
void SetStatPctModifier (UnitMods unitMod, UnitModifierPctType modifierType, float val)
 
float GetFlatModifierValue (UnitMods unitMod, UnitModifierFlatType modifierType) const
 
float GetPctModifierValue (UnitMods unitMod, UnitModifierPctType modifierType) const
 
void UpdateUnitMod (UnitMods unitMod)
 
virtual bool CheckAttackFitToAuraRequirement (WeaponAttackType, AuraEffect const *) const
 
virtual void UpdateDamageDoneMods (WeaponAttackType attackType, int32 skipEnchantSlot=-1)
 
void UpdateAllDamageDoneMods ()
 
void UpdateDamagePctDoneMods (WeaponAttackType attackType)
 
void UpdateAllDamagePctDoneMods ()
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void UpdateStatBuffMod (Stats stat)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
void SetResistance (SpellSchools school, int32 val)
 
void UpdateResistanceBuffModsMod (SpellSchools school)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void DealDamageShieldDamage (Unit *victim)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
int32 GetHighestExclusiveSameEffectSpellGroupValue (AuraEffect const *aurEff, AuraType auraType, bool checkMiscValue=false, int32 miscValue=0) const
 
bool IsHighestExclusiveAura (Aura const *aura, bool removeOtherAuraApplications=false)
 
bool IsHighestExclusiveAuraEffect (SpellInfo const *spellInfo, AuraType auraType, int32 effectAmount, uint8 auraEffectMask, bool removeOtherAuraApplications=false)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura, bool owned)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype) const
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype, std::function< bool(AuraEffect const *)> const &predicate) const
 
float GetTotalAuraMultiplier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetMaxPositiveAuraModifier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetMaxNegativeAuraModifier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (SpellInfo const *spellInfo, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
bool IsRooted () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
void SetDisableGravity (bool disable)
 
virtual bool SetSwim (bool enable)
 
void SetCanFly (bool enable)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
void SetWaterWalking (bool enable)
 
void SetFeatherFall (bool enable)
 
void SetHover (bool enable)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
bool IsStandUpOnMovementState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object, Milliseconds timed=0ms)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg) const
 -------—Pet responses methods--------------—
 
void SendPetActionSound (PetAction action) const
 
void SendPetDismissSound () const
 
void SendPetAIReaction (ObjectGuid guid) const
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
void SummonGameObjectGroup (uint8 group, std::list< GameObject * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
DualWieldMode _dualWieldMode
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ALEEventProcessor * ALEEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool stun=false, bool logout=false)
 
void SendMoveRoot (bool state)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraFlatModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
 
float m_auraPctModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define CURRENT_MAX_SPELL
Definition Unit.h:551
Definition Player.h:1085
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2368
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:571
bool m_duringRemoveFromWorld
Definition Unit.h:2233
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2146
AuraList m_removedAuras
Definition Unit.h:2150
ControlSet m_Controlled
Definition Unit.h:2057
Movement::MoveSpline * movespline
Definition Unit.h:2096
CharmInfo * m_charmInfo
Definition Unit.h:2168
MotionMaster * i_motionMaster
Definition Unit.h:2171
void _DeleteRemovedAuras()
Definition Unit.cpp:3856
DynObjectList m_dynObj
Definition Unit.h:2140
SafeUnitPointer m_movedByPlayer
Definition Unit.h:2059
AttackerSet m_attackers
Definition Unit.h:2132
Unit * m_attacking
Definition Unit.h:2133
GameObjectList m_gameObj
Definition Unit.h:2143
AuraMap m_ownedAuras
Definition Unit.h:2148
AuraApplicationMap m_appliedAuras
Definition Unit.h:2149
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4385
SharedVisionList m_sharedVision
Definition Unit.h:2169

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( )
explicitprotected
206 : WorldObject(),
207 m_movedByPlayer(nullptr),
209 IsAIEnabled(false),
210 NeedChangeAI(false),
212 m_CreatedByPlayer(false),
214 i_AI(nullptr),
215 i_disabledAI(nullptr),
216 m_realRace(0),
217 m_race(0),
219 m_procDeep(0),
221 i_motionMaster(new MotionMaster(this)),
222 m_regenTimer(0),
223 m_ThreatMgr(this),
224 m_vehicle(nullptr),
225 m_vehicleKit(nullptr),
227 m_HostileRefMgr(this),
228 m_comboTarget(nullptr),
230{
231#ifdef _MSC_VER
232#pragma warning(default:4355)
233#endif
236
238
245
247
248 m_state = 0;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition SharedDefines.h:1285
#define MAX_STATS
Definition SharedDefines.h:276
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:303
@ MAX_SUMMON_SLOT
Definition SharedDefines.h:3559
@ GHOST_VISIBILITY_ALIVE
Definition SharedDefines.h:1292
#define MAX_GAMEOBJECT_SLOT
Definition SharedDefines.h:3563
#define MAX_SPELL_IMMUNITY
Definition SharedDefines.h:1415
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:364
@ BASE_VALUE
Definition Unit.h:128
@ TOTAL_VALUE
Definition Unit.h:129
@ MINDAMAGE
Definition Unit.h:142
@ MAXDAMAGE
Definition Unit.h:143
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:173
@ UNIT_MOD_END
Definition Unit.h:175
@ OFF_ATTACK
Definition Unit.h:217
@ MAX_ATTACK
Definition Unit.h:219
@ BASE_ATTACK
Definition Unit.h:216
@ RANGED_ATTACK
Definition Unit.h:218
#define BASE_MAXDAMAGE
Definition Unit.h:42
@ MAX_REACTIVE
Definition Unit.h:613
#define BASE_MINDAMAGE
Definition Unit.h:41
@ TOTAL_PCT
Definition Unit.h:136
@ BASE_PCT
Definition Unit.h:135
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:394
Definition MotionMaster.h:137
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:251
uint16 m_updateFlag
Definition Object.h:254
TypeID m_objectTypeId
Definition Object.h:253
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2173
uint32 m_lastSanctuaryTime
Definition Unit.h:2073
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2184
uint32 m_transform
Definition Unit.h:2144
uint32 m_CombatTimer
Definition Unit.h:2216
bool m_canModifyStats
Definition Unit.h:2163
UnitAI * i_disabledAI
Definition Unit.h:2121
bool NeedChangeAI
Definition Unit.h:2080
uint32 m_state
Definition Unit.h:2215
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2128
float m_modAttackSpeedPct[3]
Definition Unit.h:2070
uint8 m_realRace
Definition Unit.h:2123
Vehicle * m_vehicle
Definition Unit.h:2180
uint8 m_race
Definition Unit.h:2124
UnitAI * i_AI
Definition Unit.h:2120
uint32 _lastExtraAttackSpell
Definition Unit.h:2238
bool _instantCast
Definition Unit.h:2188
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:2062
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2230
float m_createStats[MAX_STATS]
Definition Unit.h:2130
float m_auraFlatModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
Definition Unit.h:2160
float m_modRangedHitChance
Definition Unit.h:2065
DeathState m_deathState
Definition Unit.h:2135
uint32 m_unitTypeMask
Definition Unit.h:2183
uint32 m_removedAurasCount
Definition Unit.h:2152
ThreatMgr m_ThreatMgr
Definition Unit.h:2176
Unit * m_comboTarget
Definition Unit.h:2226
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2151
bool m_AutoRepeatFirstCast
Definition Unit.h:2126
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2092
int32 m_regenTimer
Definition Unit.h:2174
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2093
bool m_ControlledByPlayer
Definition Unit.h:2082
uint32 m_last_notify_mstime
Definition Unit.h:2090
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2072
int8 m_comboPoints
Definition Unit.h:2227
uint32 _oldFactionId
faction before charm
Definition Unit.h:2235
int32 m_baseSpellCritChance
Definition Unit.h:2067
float m_modMeleeHitChance
Definition Unit.h:2064
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2162
Position m_last_notify_position
Definition Unit.h:2089
Vehicle * m_vehicleKit
Definition Unit.h:2181
bool IsAIEnabled
Definition Unit.h:2079
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2222
DualWieldMode _dualWieldMode
Definition Unit.h:2055
bool m_applyResilience
Definition Unit.h:2187
uint32 m_interruptMask
Definition Unit.h:2158
int32 m_procDeep
Definition Unit.h:2137
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2166
float m_modSpellHitChance
Definition Unit.h:2066
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:2061
bool m_cleanupDone
Definition Unit.h:2232
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2236
bool m_CreatedByPlayer
Definition Unit.h:2083
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2091
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2069
uint32 m_lastManaUse
Definition Unit.h:2217
float m_auraPctModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
Definition Unit.h:2161
WorldObject()
Definition Object.cpp:1032
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:612
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:297

References _dualWieldMode, _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, AUTO, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraFlatModifiersGroup, m_auraPctModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2211{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4540{
4542 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4543
4544 _RemoveNoStackAurasDueToAura(aura, true);
4545
4546 if (aura->IsRemoved())
4547 return;
4548
4550 if (aura->IsSingleTarget())
4551 {
4552 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4553 /* @HACK: Player is not in world during loading auras.
4554 * Single target auras are not saved or loaded from database
4555 * but may be created as a result of aura links (player mounts with passengers)
4556 */
4557
4558 // register single target aura
4559 caster->GetSingleCastAuras().push_back(aura);
4560 // remove other single target auras
4561 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4562 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4563 {
4564 if ((*itr) != aura &&
4565 (*itr)->IsSingleTargetWith(aura))
4566 {
4567 (*itr)->Remove();
4568 itr = scAuras.begin();
4569 }
4570 else
4571 ++itr;
4572 }
4573 }
4574}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:162
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1094
uint32 GetId() const
Definition SpellAuras.cpp:405
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1174
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:167
bool IsSingleTarget() const
Definition SpellAuras.h:165
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura, bool owned)
Definition Unit.cpp:4792
std::list< Aura * > AuraList
Definition Unit.h:672
bool IsDuringRemoveFromWorld() const
Definition Unit.h:693
AuraList & GetSingleCastAuras()
Definition Unit.h:1414

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5615{
5616 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5617 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5618}
@ AURA_EFFECT_HANDLE_STAT
Definition SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4631{
4632 Aura* aura = aurApp->GetBase();
4633
4634 _RemoveNoStackAurasDueToAura(aura, false);
4635
4636 if (aurApp->GetRemoveMode())
4637 return;
4638
4639 Unit* caster = aura->GetCaster();
4640
4641 // Update target aura state flag
4642 SpellInfo const* spellInfo = aura->GetSpellInfo();
4643 if (AuraStateType aState = spellInfo->GetAuraState())
4644 {
4645 uint32 aStateMask = (1 << (aState - 1));
4646 // force update so the new caster registers it
4647 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4649 else
4650 ModifyAuraState(aState, true);
4651 }
4652
4653 if (aurApp->GetRemoveMode())
4654 return;
4655
4656 // Sitdown on apply aura req seated
4659
4660 if (aurApp->GetRemoveMode())
4661 return;
4662
4663 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4664
4665 // apply effects of the aura
4666 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4667 {
4668 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4669 aurApp->_HandleEffect(i, true);
4670 }
4671
4672 sScriptMgr->OnAuraApply(this, aura);
4673}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1637
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:725
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1329
AuraStateType
Definition SharedDefines.h:1299
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
void _HandleEffect(uint8 effIndex, bool apply)
Definition SpellAuras.cpp:161
Aura * GetBase() const
Definition SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:73
Definition SpellAuras.h:87
Unit * GetCaster() const
Definition SpellAuras.cpp:410
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition SpellAuras.cpp:1217
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:871
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2070
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:1951
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:655
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10707
void SetStandState(uint8 state)
Definition Unit.cpp:16967
bool IsSitState() const
Definition Unit.cpp:16943

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4617{
4618 ASSERT(aura);
4619 ASSERT(aura->HasEffect(effIndex));
4621 ASSERT(aurApp);
4622 if (!aurApp->GetEffectMask())
4623 _ApplyAura(aurApp, 1 << effIndex);
4624 else
4625 aurApp->_HandleEffect(effIndex, true);
4626}
Definition SpellAuras.h:37
uint8 GetEffectMask() const
Definition SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:174
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:184
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4630

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4579{
4580 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4582 // aura musn't be removed
4583 ASSERT(!aura->IsRemoved());
4584
4585 // aura mustn't be already applied on target
4586 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4587
4588 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4589 uint32 aurId = aurSpellInfo->Id;
4590
4591 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4592 // Xinef: Added IsAllowingDeadTarget check
4593 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4594 return nullptr;
4595
4596 Unit* caster = aura->GetCaster();
4597
4598 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4599 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4600
4601 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4602 // xinef: even if it gets removed, it will be reapplied in a second
4603 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4604 {
4605 m_interruptableAuras.push_back(aurApp);
4606 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4607 }
4608
4609 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4610 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4611
4612 aura->_ApplyForTarget(this, caster, aurApp);
4613 return aurApp;
4614}
WorldObject * GetOwner() const
Definition SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:186
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:431
bool IsPlayer() const
Definition Object.h:200
Player * ToPlayer()
Definition Object.h:201
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1589
bool IsAlive() const
Definition Unit.h:1773
AuraApplicationList m_interruptableAuras
Definition Unit.h:2156
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2157

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3857{
3858 while (!m_removedAuras.empty())
3859 {
3860 delete m_removedAuras.front();
3861 m_removedAuras.pop_front();
3862 }
3863}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19644{
19645 // Must be called only from aura handler
19646 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19647 return;
19648
19649 if (m_vehicle)
19650 {
19651 if (m_vehicle == vehicle)
19652 {
19653 if (seatId >= 0 && seatId != GetTransSeat())
19654 {
19655 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19656 ChangeSeat(seatId);
19657 }
19658
19659 return;
19660 }
19661 else
19662 {
19663 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19664 ExitVehicle();
19665 }
19666 }
19667
19668 if (!aurApp || aurApp->GetRemoveMode())
19669 return;
19670
19671 if (Player* player = ToPlayer())
19672 {
19673 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19674 return;
19675
19676 sScriptMgr->AnticheatSetUnderACKmount(player);
19677
19679 player->StopCastingCharm();
19680 player->StopCastingBindSight();
19681 Dismount();
19683
19684 // drop flag at invisible in bg
19685 if (Battleground* bg = player->GetBattleground())
19686 bg->EventPlayerDroppedFlag(player);
19687
19689 player->SendDirectMessage(&data);
19690 }
19691
19692 ASSERT(!m_vehicle);
19693 m_vehicle = vehicle;
19694
19695 if (!m_vehicle->AddPassenger(this, seatId))
19696 {
19697 m_vehicle = nullptr;
19698 return;
19699 }
19700
19701 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19703}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4176
void Dismount()
Definition Unit.cpp:13683
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1906
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5236
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19705
Vehicle * GetVehicleKit() const
Definition Unit.h:1904
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5307
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19724
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:319
int8 GetTransSeat() const
Definition Object.h:689
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19762{
19763 if (!m_vehicle)
19764 return;
19765
19766 // This should be done before dismiss, because there may be some aura removal
19769
19770 Player* player = ToPlayer();
19771
19772 // If player is on mouted duel and exits the mount should immediatly lose the duel
19773 if (player && player->duel && player->duel->IsMounted)
19774 player->DuelComplete(DUEL_FLED);
19775
19776 Vehicle* vehicle = m_vehicle;
19777 Unit* vehicleBase = m_vehicle->GetBase();
19778 m_vehicle = nullptr;
19779
19780 if (!vehicleBase)
19781 return;
19782
19783 if (IsPlayer())
19785
19786 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19787
19788 Position pos;
19789 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19790 if (exitPosition)
19791 pos = *exitPosition;
19792 else
19793 {
19794 // Set exit position to vehicle position and use the current orientation
19795 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19796 pos.SetOrientation(vehicleBase->GetOrientation());
19797
19798 // Change exit position based on seat entry addon data
19799 if (seatAddon)
19800 {
19802 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19804 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19805 }
19806 }
19807
19809
19810 if (player)
19811 {
19813
19814 sScriptMgr->AnticheatSetUnderACKmount(player);
19815 }
19816
19817 // xinef: hack for flameleviathan seat vehicle
19818 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19819 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19820 {
19821 Movement::MoveSplineInit init(this);
19822 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19823 init.SetFacing(vehicleBase->GetOrientation());
19824 init.SetTransportExit();
19825 init.Launch();
19826 }
19827 else
19828 {
19829 float o = pos.GetAngle(this);
19830 Movement::MoveSplineInit init(this);
19831 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19832 init.SetFacing(GetOrientation());
19833 init.SetTransportExit();
19834 init.Launch();
19835 DisableSpline();
19836 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19838 }
19839
19840 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19841 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19842 {
19844 }
19845
19846 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19847 if (((Minion*)vehicleBase)->GetOwner() == this)
19848 {
19849 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19850 {
19851 vehicle->Dismiss();
19852 }
19853 else if (vehicleBase->IsCreature())
19854 {
19855 vehicle->Uninstall();
19856 vehicleBase->m_Events.AddEventAtOffset(new VehicleDespawnEvent(*vehicleBase, 2s), 2s);
19857 }
19858
19859 // xinef: ugly hack, no appripriate hook later to cast spell
19860 if (player)
19861 {
19862 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19863 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19864 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19865 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19866 }
19867 }
19868
19870 {
19871 // Vehicle just died, we die too
19872 if (vehicleBase->getDeathState() == DeathState::JustDied)
19874 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19875 else
19876 ToTempSummon()->UnSummon(2s); // Approximation
19877 }
19878
19879 if (player)
19880 {
19882 player->SetCanTeleport(true);
19883 }
19884}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:903
@ DUEL_FLED
Definition SharedDefines.h:3870
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEventAtOffset(BasicEvent *event, Milliseconds offset, uint8 eventGroup=0)
Definition EventProcessor.h:108
Definition TemporarySummon.h:87
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:676
Definition MoveSplineInit.h:63
bool IsCreature() const
Definition Object.h:204
void SetCanTeleport(bool value)
Definition Player.h:2531
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6420
void SetFallInformation(uint32 time, float z)
Definition Player.h:2369
void SetExpectingChangeTransport(bool state)
Definition Player.h:2668
std::unique_ptr< DuelInfo > duel
Definition Player.h:1892
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14256
uint32 GetDelayedOperations() const
Definition Player.h:2115
virtual void UnSummon(Milliseconds msTime=0ms)
Definition TemporarySummon.cpp:292
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14667
Unit * GetOwner() const
Definition Unit.cpp:10810
DeathState getDeathState()
Definition Unit.h:1770
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1738
TempSummon * ToTempSummon()
Definition Unit.h:721
void DisableSpline()
Definition Unit.cpp:637
void AddUnitState(uint32 f)
Definition Unit.h:725
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18301
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:731
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19401
Definition Vehicle.h:102
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:542
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:463
void Uninstall()
Definition Vehicle.cpp:102
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:238
EventProcessor m_Events
Definition Object.h:731
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:66
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:85
Definition DBCStructure.h:2027
uint32 m_ID
Definition DBCStructure.h:2028
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

References EventProcessor::AddEventAtOffset(), AddUnitState(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitTypeMask(), Object::IsCreature(), Object::IsPlayer(), JustDied, KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Player::SetExpectingChangeTransport(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, VEHICLE_SPELL_SHADE_CONTROL_END, VehicleExitParamDest, and VehicleExitParamOffset.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14183{
14184 ASSERT(target);
14185
14186 // can assist to self
14187 if (this == target)
14188 return true;
14189
14190 // can't assist unattackable units or GMs
14191 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14192 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14193 return false;
14194
14195 // can't assist own vehicle or passenger
14196 if (m_vehicle)
14197 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14198 return false;
14199
14200 // can't assist invisible
14201 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14202 return false;
14203
14204 // can't assist dead
14205 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14206 return false;
14207
14208 // can't assist untargetable
14209 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14210 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14211 return false;
14212
14213 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14214 {
14215 // xinef: do not allow to assist non attackable units
14216 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14217 return false;
14218
14220 {
14221 if (target->IsImmuneToPC())
14222 return false;
14223 }
14224 else
14225 {
14226 if (target->IsImmuneToNPC())
14227 return false;
14228 }
14229 }
14230
14231 // can't assist non-friendly targets
14232 if (GetReactionTo(target) < REP_NEUTRAL
14233 && target->GetReactionTo(this) < REP_NEUTRAL
14234 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14235 return false;
14236
14237 // PvP case
14238 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14239 {
14240 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14242 {
14243 Player const* selfPlayerOwner = GetAffectingPlayer();
14244 if (selfPlayerOwner && targetPlayerOwner)
14245 {
14246 // can't assist player which is dueling someone
14247 if (selfPlayerOwner != targetPlayerOwner
14248 && targetPlayerOwner->duel)
14249 return false;
14250 }
14251 // can't assist player in ffa_pvp zone from outside
14252 if (target->IsFFAPvP() && !IsFFAPvP())
14253 return false;
14254
14255 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14256 if (target->IsPvP())
14257 if (IsInSanctuary() && !target->IsInSanctuary())
14258 return false;
14259 }
14260 }
14261 // PvC case - player can assist creature only if has specific type flags
14262 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14264 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14265 && !target->IsPvP())
14266 {
14267 if (Creature const* creatureTarget = target->ToCreature())
14268 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14269 }
14270 return true;
14271}
@ REP_NEUTRAL
Definition SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition SharedDefines.h:2722
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2708
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition SharedDefines.h:639
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition SharedDefines.h:628
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition SharedDefines.h:618
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:211
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:255
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:279
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:257
Definition Creature.h:47
Creature * ToCreature()
Definition Object.h:205
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10249
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:737
bool IsInSanctuary() const
Definition Unit.h:1028
bool IsFFAPvP() const
Definition Unit.h:1030
Player * GetAffectingPlayer() const
Definition Unit.cpp:10835
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1726

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
14045{
14046 ASSERT(target);
14047
14048 // can't attack self
14049 if (this == target)
14050 return false;
14051
14052 // can't attack unattackable units or GMs
14053 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14054 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14055 return false;
14056
14057 // can't attack own vehicle or passenger
14058 if (m_vehicle)
14059 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14060 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
14061 return false;
14062
14063 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
14064 //Ignore stealth if target is player and unit in combat with same player
14065 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
14066 return false;
14067
14068 // can't attack dead
14069 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14070 return false;
14071
14072 // can't attack untargetable
14073 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14074 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14075 return false;
14076
14077 if (Player const* playerAttacker = ToPlayer())
14078 {
14079 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
14080 return false;
14081 }
14082 // check flags
14084 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14085 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14086 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14087 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14088 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14089 return false;
14090
14091 // CvC case - can attack each other only when one of them is hostile
14093 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14094
14095 // PvP, PvC, CvP case
14096 // can't attack friendly targets
14097 ReputationRank repThisToTarget = GetReactionTo(target);
14098 ReputationRank repTargetToThis;
14099
14100 if (repThisToTarget > REP_NEUTRAL
14101 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14102 {
14103 // contested guards can attack contested PvP players even though players may be friendly
14104 if (!target->IsControlledByPlayer())
14105 return false;
14106
14107 bool isContestedGuard = false;
14108 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
14109 isContestedGuard = entry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS;
14110
14111 bool isContestedPvp = false;
14112 if (Player const* player = target->GetCharmerOrOwnerPlayerOrPlayerItself())
14113 isContestedPvp = player->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP);
14114
14115 if (!isContestedGuard && !isContestedPvp)
14116 return false;
14117 }
14118
14119 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14120 if (repThisToTarget == REP_NEUTRAL &&
14121 repTargetToThis <= REP_NEUTRAL)
14122 {
14123 Player* owner = GetAffectingPlayer();
14124 Unit const* const thisUnit = owner ? owner : this;
14125 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14126 !(target->IsCreature() && thisUnit->IsCreature()))
14127 {
14128 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14129 Unit const* creature = target->IsCreature() ? target : thisUnit;
14130
14131 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14132 {
14133 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14134 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14135 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14136 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14137 return false;
14138 }
14139 }
14140 }
14141
14142 Creature const* creatureAttacker = ToCreature();
14143 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14144 return false;
14145
14146 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14147 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14148
14149 // check duel - before sanctuary checks
14150 if (playerAffectingAttacker && playerAffectingTarget)
14151 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14152 return true;
14153
14154 // PvP case - can't attack when attacker or target are in sanctuary
14155 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14156 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14157 return false;
14158
14159 // additional checks - only PvP case
14160 if (playerAffectingAttacker && playerAffectingTarget)
14161 {
14162 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14163 return false;
14164
14165 if (target->IsPvP())
14166 return true;
14167
14168 if (IsFFAPvP() && target->IsFFAPvP())
14169 return true;
14170
14172 }
14173 return true;
14174}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:360
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:468
@ PLAYER_FLAGS_UBER
Definition Player.h:479
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:584
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:274
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:270
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:261
#define WORLD_TRIGGER
Definition Unit.h:39
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:205
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:931
ReputationMgr & GetReputationMgr()
Definition Player.h:2142
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10219
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10826
bool IsPvP() const
Definition Unit.h:1029
bool HasStealthAura() const
Definition Unit.h:1821
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:21141
bool IsImmuneToNPC() const
Definition Unit.h:919
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10421
bool IsImmuneToPC() const
Definition Unit.h:917
bool IsInCombat() const
Definition Unit.h:924
uint32 type_flags
Definition CreatureData.h:219
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), Vehicle::GetBase(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsControlledByPlayer(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_CONTESTED_PVP, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4816{
4817 if (apply)
4818 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4819 else
4820 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4821}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:447
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2154

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6353{
6354 m_dynObj.push_back(dynObj);
6355}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5609{
5610 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5611 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5612}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2212{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura,
bool  owned 
)
4793{
4794 //SpellInfo const* spellProto = aura->GetSpellInfo();
4795
4796 // passive spell special case (only non stackable with ranks)
4797
4798 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4799 // if (spellProto->IsPassiveStackableWithRanks())
4800 // return;
4801
4802 ASSERT(aura);
4803 if (!IsHighestExclusiveAura(aura))
4804 {
4805 aura->Remove();
4806 return;
4807 }
4808
4809 if (owned)
4810 RemoveOwnedAuras([aura](Aura const* ownedAura) { return !aura->CanStackWith(ownedAura); });
4811 else
4812 RemoveAppliedAuras([aura](AuraApplication const* appliedAura) { return !aura->CanStackWith(appliedAura->GetBase()); });
4813}
bool CanStackWith(Aura const *existingAura) const
Definition SpellAuras.cpp:1973
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4989
void RemoveOwnedAuras(std::function< bool(Aura const *)> const &check)
Definition Unit.cpp:4976
bool IsHighestExclusiveAura(Aura const *aura, bool removeOtherAuraApplications=false)
Definition Unit.cpp:4434

References ASSERT, Aura::CanStackWith(), AuraApplication::GetBase(), IsHighestExclusiveAura(), Aura::Remove(), RemoveAppliedAuras(), and RemoveOwnedAuras().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4484{
4485 ASSERT(casterGUID || caster);
4486 if (!casterGUID)
4487 casterGUID = caster->GetGUID();
4488
4489 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4490 if (!newAura->IsMultiSlotAura())
4491 {
4492 // check if cast item changed
4493 ObjectGuid castItemGUID;
4494 if (castItem)
4495 castItemGUID = castItem->GetGUID();
4496
4497 // find current aura from spell and change it's stackamount, or refresh it's duration
4498 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4499 {
4500 // effect masks do not match
4501 // extremely rare case
4502 // let's just recreate aura
4503 if (effMask != foundAura->GetEffectMask())
4504 return nullptr;
4505
4506 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4507 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4508 {
4509 if (!foundAura->HasEffect(i))
4510 continue;
4511
4512 int bp;
4513 if (baseAmount)
4514 bp = *(baseAmount + i);
4515 else
4516 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4517
4518 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4519 *oldBP = bp;
4520 }
4521
4522 // correct cast item guid if needed
4523 if (castItemGUID != foundAura->GetCastItemGUID())
4524 {
4525 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4526 *oldGUID = castItemGUID;
4527 }
4528
4529 // try to increase stack amount
4530 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4531 sScriptMgr->OnAuraApply(this, foundAura);
4532 return foundAura;
4533 }
4534 }
4535
4536 return nullptr;
4537}
std::int32_t int32
Definition Define.h:103
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition SpellInfo.h:198
Definition ObjectGuid.h:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4879

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, and sScriptMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4772{
4773 // aura can be removed from unit only if it's applied on it, shouldn't happen
4774 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4775
4776 uint32 spellId = aurApp->GetBase()->GetId();
4777 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4778
4779 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4780 {
4781 if (iter->second == aurApp)
4782 {
4783 _UnapplyAura(iter, removeMode);
4784 return;
4785 }
4786 else
4787 ++iter;
4788 }
4789 ABORT();
4790}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:666
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4676

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4677{
4678 AuraApplication* aurApp = i->second;
4679 ASSERT(aurApp);
4680 ASSERT(!aurApp->GetRemoveMode());
4681 ASSERT(aurApp->GetTarget() == this);
4682
4683 aurApp->SetRemoveMode(removeMode);
4684 Aura* aura = aurApp->GetBase();
4685 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4686
4687 // dead loop is killing the server probably
4688 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4689
4691
4692 Unit* caster = aura->GetCaster();
4693
4694 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4695 m_appliedAuras.erase(i);
4696
4697 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4698 // xinef: event if it gets removed, it will be reapplied in a second
4699 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4700 {
4701 m_interruptableAuras.remove(aurApp);
4703 }
4704
4705 bool auraStateFound = false;
4706 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4707 if (auraState)
4708 {
4709 bool canBreak = false;
4710 // Get mask of all aurastates from remaining auras
4711 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4712 {
4713 if (itr->second == aurApp)
4714 {
4715 m_auraStateAuras.erase(itr);
4716 itr = m_auraStateAuras.lower_bound(auraState);
4717 canBreak = true;
4718 continue;
4719 }
4720 auraStateFound = true;
4721 ++itr;
4722 }
4723 }
4724
4725 aurApp->_Remove();
4726 aura->_UnapplyForTarget(this, caster, aurApp);
4727
4728 // remove effects of the spell - needs to be done after removing aura from lists
4729 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4730 {
4731 if (aurApp->HasEffect(itr))
4732 aurApp->_HandleEffect(itr, false);
4733 }
4734
4735 // all effect mustn't be applied
4736 ASSERT(!aurApp->GetEffectMask());
4737
4738 // Remove totem at next update if totem loses its aura
4739 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4740 {
4741 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4743 }
4744
4745 // Remove aurastates only if needed and were not found
4746 if (auraState)
4747 {
4748 if (!auraStateFound)
4749 ModifyAuraState(auraState, false);
4750 else
4751 {
4752 // update for casters, some shouldn't 'see' the aura state
4753 uint32 aStateMask = (1 << (auraState - 1));
4754 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4756 }
4757 }
4758
4759 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4760
4761 // only way correctly remove all auras from list
4762 //if (removedAuras != m_removedAurasCount) new aura may be added
4763 i = m_appliedAuras.begin();
4764
4765 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4766
4767 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4768 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4769}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:72
void _Remove()
Definition SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:454
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:232
CreatureAI * AI() const
Definition Creature.h:144
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:400
Totem * ToTotem()
Definition Unit.h:720
void UpdateInterruptMask()
Definition Unit.cpp:768
bool IsTotem() const
Definition Unit.h:789

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6358{
6359 m_dynObj.remove(dynObj);
6360}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3924{
3925 SpellInfo const* spellProto = nullptr;
3927 {
3929 }
3930
3931 if (!spellProto)
3932 {
3933 return;
3934 }
3935
3936 static uint32 const HUNTER_AUTOSHOOT = 75;
3937
3938 // Check "realtime" interrupts
3939 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3940 {
3941 // cancel wand shoot
3942 if (spellProto->Id != HUNTER_AUTOSHOOT)
3944 m_AutoRepeatFirstCast = true;
3945 return;
3946 }
3947
3948 // Apply delay (Hunter's autoshoot not affected)
3949 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3950 {
3952 }
3953
3954 m_AutoRepeatFirstCast = false;
3955
3956 // Check for ranged attack timer
3958 {
3960 if (result != SPELL_CAST_OK)
3961 {
3962 if (spellProto->Id != HUNTER_AUTOSHOOT)
3963 {
3965 }
3966
3967 return;
3968 }
3969
3970 // We want to shoot
3971 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3972 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3973
3974 // Reset attack
3976
3977 // Blizzlike: Reset melee swing timers when performing ranged attack
3980 }
3981}
SpellCastResult
Definition SharedDefines.h:959
@ SPELL_CAST_OK
Definition SharedDefines.h:1149
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:547
Definition Spell.h:295
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3403
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5603
SpellInfo const *const m_spellInfo
Definition Spell.h:531
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4104
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4146
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:875
bool isMoving() const
Definition Unit.h:1688
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:877
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:878
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643

References BASE_ATTACK, Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, OFF_ATTACK, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3866{
3869
3870 // remove finished spells from current pointers
3871 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3872 {
3873 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3874 {
3876 m_currentSpells[i] = nullptr; // remove pointer
3877 }
3878 }
3879
3880 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3882 {
3883 Aura* i_aura = m_auraUpdateIterator->second;
3884 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3885 i_aura->UpdateOwner(time, this);
3886 }
3887
3888 // remove expired auras - do that after updates(used in scripts?)
3889 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3890 {
3891 if (i->second->IsExpired())
3893 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3894 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3895 else
3896 ++i;
3897 }
3898
3899 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3900 if (itr->second->IsNeedClientUpdate())
3901 itr->second->ClientUpdate();
3902
3904
3905 if (!m_gameObj.empty())
3906 {
3907 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3908 {
3909 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3910 if (!go->isSpawned())
3911 {
3912 go->SetOwnerGUID(ObjectGuid::Empty);
3913 go->SetRespawnTime(0);
3914 go->Delete();
3915 m_gameObj.erase(itr++);
3916 continue;
3917 }
3918 ++itr;
3919 }
3920 }
3921}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:237
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:698
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4824
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3923
VisibleAuraMap m_visibleAuras
Definition Unit.h:2164
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:115

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
19137{
19138 if (!spellInfo)
19139 return nullptr;
19140
19141 if (target->IsImmunedToSpell(spellInfo))
19142 return nullptr;
19143
19144 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
19145 {
19146 if (!(effMask & (1 << i)))
19147 continue;
19148 if (target->IsImmunedToSpellEffect(spellInfo, i))
19149 effMask &= ~(1 << i);
19150 }
19151
19152 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
19153 {
19154 aura->ApplyForTargets();
19155 return aura;
19156 }
19157 return nullptr;
19158}
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition SpellAuras.cpp:265
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13181
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:13091

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
19122{
19123 if (!target)
19124 return nullptr;
19125
19126 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
19127 if (!spellInfo)
19128 return nullptr;
19129
19130 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
19131 return nullptr;
19132
19133 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
19134}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1638
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:467
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:399
#define sSpellMgr
Definition SpellMgr.h:826
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:19121

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by boss_flame_leviathan::ActivateTowers(), AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), Player::ApplyItemDependentAuras(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_hadronox::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::Reset(), npc_hodirs_fury::Reset(), npc_mimirons_inferno::Reset(), boss_yoggsaron_immortal_guardian::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
1008{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2228

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
1005{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition Unit.cpp:17079

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
17080{
17081 if (!count)
17082 {
17083 return;
17084 }
17085
17086 if (target && target != m_comboTarget)
17087 {
17088 if (m_comboTarget)
17089 {
17091 }
17092
17093 m_comboTarget = target;
17094 m_comboPoints = count;
17095 target->AddComboPointHolder(this);
17096 }
17097 else
17098 {
17099 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
17100 }
17101
17103}
void SendComboPoints()
Definition Unit.cpp:17122
void AddComboPointHolder(Unit *unit)
Definition Unit.h:1008
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:1009

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2802{
2804 if (!targetGUID)
2805 {
2806 if (ObjectGuid selection = GetTarget())
2807 {
2808 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2809 }
2810 else
2811 return;
2812 }
2813
2814 extraAttacksTargets[targetGUID] += count;
2815}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2239
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2240
ObjectGuid GetTarget() const
Definition Unit.h:851

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
768{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:693
uint16 flags2
Definition Object.h:291

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition Unit.h:2224

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6414{
6415 if (!gameObj || gameObj->GetOwnerGUID())
6416 return;
6417
6418 m_gameObj.push_back(gameObj->GetGUID());
6419 gameObj->SetOwnerGUID(GetGUID());
6420
6421 if (IsPlayer() && gameObj->GetSpellId())
6422 {
6423 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6424 // Need disable spell use for owner
6425 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6426 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6427 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6428 }
6429}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10876
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1589{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17551{
17552 if (!IsPlayer())
17553 return;
17554
17555 m_petAuras.insert(petSpell);
17556 if (Pet* pet = ToPlayer()->GetPet())
17557 pet->CastPetAura(petSpell);
17558 else if (Unit* charm = GetCharm())
17559 charm->CastPetAura(petSpell);
17560}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10881
PetAuraSet m_petAuras
Definition Unit.h:2077
Pet * GetPet(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11386{
11387 if (m_sharedVision.empty())
11388 setActive(true);
11389
11390 m_sharedVision.push_back(player);
11391 player->m_isInSharedVisionOf.insert(this);
11392}
void setActive(bool isActiveObject)
Definition Object.cpp:1058

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
2000{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition Unit.h:2086

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14768{
14769 // Only mobs can manage threat lists
14771 {
14772 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14773 }
14774}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:504
bool HasUnitState(const uint32 f) const
Definition Unit.h:726
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14728

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::DamageTaken(), boss_thorim::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), boss_eck::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), npc_molten_golem::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15919{
15920 if (!IsInWorld())
15921 {
15923 }
15924}
void AddToWorld() override
Definition Object.cpp:1190

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
725{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
732{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17301{
17303
17304 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17305 if (val > 0.f)
17306 {
17308 ApplyPercentModFloatVar(amount, val, !apply);
17309 }
17310 else
17311 {
17313 ApplyPercentModFloatVar(amount, -val, apply);
17314 }
17316 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17317}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Unit.cpp:17295
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:610
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:726
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:904

References ApplyPercentModFloatVar(), AsUnderlyingType(), GetAttackTime(), Object::GetFloatValue(), m_attackTimer, m_modAttackSpeedPct, Object::SetFloatValue(), and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17320{
17321 float amount = GetFloatValue(UNIT_MOD_CAST_SPEED);
17322
17323 if (val > 0.f)
17324 ApplyPercentModFloatVar(amount, val, !apply);
17325 else
17326 ApplyPercentModFloatVar(amount, -val, apply);
17327
17329}
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137

References ApplyPercentModFloatVar(), Object::GetFloatValue(), Object::SetFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15241{
15242 // Checking for existing in the table
15243 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15244 {
15245 if (i->DRGroup != group)
15246 continue;
15247
15248 if (apply)
15249 i->stack += 1;
15250 else if (i->stack)
15251 {
15252 i->stack -= 1;
15253 // Remember time after last aura from group removed
15254 if (i->stack == 0)
15255 i->hitTime = GameTime::GetGameTimeMS().count();
15256 }
15257 break;
15258 }
15259}
Diminishing m_Diminishing
Definition Unit.h:2220
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15162{
15163 // xinef: dont apply diminish to self casts
15164 if (duration == -1 || group == DIMINISHING_NONE)
15165 return 1.0f;
15166
15167 // test pet/charm masters instead pets/charmeds
15168 Unit const* targetOwner = GetOwner();
15169 Unit const* casterOwner = caster->GetOwner();
15170
15171 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15172 if (limitduration > 0 && duration > limitduration)
15173 {
15174 Unit const* target = targetOwner ? targetOwner : this;
15175 Unit const* source = casterOwner ? casterOwner : caster;
15176
15177 if ((target->IsPlayer()
15179 && source->IsPlayer())
15180 duration = limitduration;
15181 }
15182
15183 float mod = 1.0f;
15184
15185 if (group == DIMINISHING_TAUNT)
15186 {
15188 {
15189 DiminishingLevels diminish = Level;
15190 switch (diminish)
15191 {
15193 break;
15195 mod = 0.65f;
15196 break;
15198 mod = 0.4225f;
15199 break;
15201 mod = 0.274625f;
15202 break;
15204 mod = 0.0f;
15205 break;
15206 default:
15207 break;
15208 }
15209 }
15210 }
15211 // Some diminishings applies to mobs too (for example, Stun)
15213 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15214 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15216 {
15217 DiminishingLevels diminish = Level;
15218 switch (diminish)
15219 {
15221 break;
15223 mod = 0.5f;
15224 break;
15226 mod = 0.25f;
15227 break;
15229 mod = 0.0f;
15230 break;
15231 default:
15232 break;
15233 }
15234 }
15235
15236 duration = int32(duration * mod);
15237 return mod;
15238}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3498
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3516
@ DRTYPE_PLAYER
Definition SharedDefines.h:3491
@ DRTYPE_ALL
Definition SharedDefines.h:3492
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:242
DiminishingLevels
Definition Unit.h:269
@ DIMINISHING_LEVEL_3
Definition Unit.h:272
@ DIMINISHING_LEVEL_1
Definition Unit.h:270
@ DIMINISHING_LEVEL_4
Definition Unit.h:274
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:273
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:275
@ DIMINISHING_LEVEL_2
Definition Unit.h:271
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:77

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14944{
14945 if (Player* modOwner = GetSpellModOwner())
14946 {
14947 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14948 switch (effect_index)
14949 {
14950 case 0:
14951 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14952 break;
14953 case 1:
14954 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14955 break;
14956 case 2:
14957 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14958 break;
14959 }
14960 }
14961 return value;
14962}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16803

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19186{
19187 // player mounted on multi-passenger mount is also classified as vehicle
19188 if (victim->IsVehicle() && !victim->IsPlayer())
19189 return;
19190
19191 Unit const* target = nullptr;
19192 if (victim->IsPlayer())
19193 target = victim;
19194 else if (victim->IsCreature())
19195 {
19196 if (Unit* owner = victim->GetOwner())
19197 if (owner->IsPlayer())
19198 target = owner;
19199 }
19200
19201 if (!target)
19202 return;
19203
19204 switch (type)
19205 {
19207 // Crit chance reduction works against nonpets
19208 if (crit)
19209 *crit -= target->GetMeleeCritChanceReduction();
19210 if (damage)
19211 {
19212 if (isCrit)
19213 *damage -= target->GetMeleeCritDamageReduction(*damage);
19214 *damage -= target->GetMeleeDamageReduction(*damage);
19215 }
19216 break;
19218 // Crit chance reduction works against nonpets
19219 if (crit)
19220 *crit -= target->GetRangedCritChanceReduction();
19221 if (damage)
19222 {
19223 if (isCrit)
19224 *damage -= target->GetRangedCritDamageReduction(*damage);
19225 *damage -= target->GetRangedDamageReduction(*damage);
19226 }
19227 break;
19229 // Crit chance reduction works against nonpets
19230 if (crit)
19231 *crit -= target->GetSpellCritChanceReduction();
19232 if (damage)
19233 {
19234 if (isCrit)
19235 *damage -= target->GetSpellCritDamageReduction(*damage);
19236 *damage -= target->GetSpellDamageReduction(*damage);
19237 }
19238 break;
19239 default:
19240 break;
19241 }
19242}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:239
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:240
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:238
float GetSpellCritChanceReduction() const
Definition Unit.h:1257
float GetRangedCritChanceReduction() const
Definition Unit.h:1256
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1261
float GetMeleeCritChanceReduction() const
Definition Unit.h:1255
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1249
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1260
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1259
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1250
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1248

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13575{
13576 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13577
13578 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13579 {
13580 // Create dispel mask by dispel type
13581 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13582 // Dispel all existing auras vs current dispel type
13584 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13585 {
13586 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13587 if (spell->GetDispelMask() & dispelMask)
13588 {
13589 // Dispel aura
13590 RemoveAura(itr);
13591 }
13592 else
13593 ++itr;
13594 }
13595 }
13596}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:445
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1409
uint32 GetDispelMask() const
Definition SpellInfo.cpp:1932
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13547
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4895
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:664
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1368

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13548{
13549 if (apply)
13550 {
13551 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13552 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13553 return;
13554
13555 SpellImmune immune;
13556 immune.spellId = spellId;
13557 immune.type = type;
13558 immune.blockType = blockType;
13559 m_spellImmune[op].push_back(std::move(immune));
13560 }
13561 else
13562 {
13563 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13564 {
13565 if (itr->spellId == spellId && itr->type == type)
13566 {
13567 m_spellImmune[op].erase(itr);
13568 break;
13569 }
13570 }
13571 }
13572}
Definition Unit.cpp:13538
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_auriaya::ExecuteEvent(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyer(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::PassengerBoarded(), npc_hover_disk::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), npc_sanguine_spirit::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::Reset(), boss_flame_leviathan::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatPctModifier()

void Unit::ApplyStatPctModifier ( UnitMods  unitMod,
UnitModifierPctType  modifierType,
float  amount 
)
15349{
15350 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_PCT_END)
15351 {
15352 LOG_ERROR("entities.unit", "ERROR in ApplyStatPctModifier(): non-existing UnitMods or wrong UnitModifierType!");
15353 return;
15354 }
15355
15356 if (!pct)
15357 return;
15358
15359 switch (modifierType)
15360 {
15361 case BASE_PCT:
15362 case TOTAL_PCT:
15363 AddPct(m_auraPctModifiersGroup[unitMod][modifierType], pct);
15364 break;
15365 default:
15366 break;
15367 }
15368
15369 UpdateUnitMod(unitMod);
15370}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ MODIFIER_TYPE_PCT_END
Definition Unit.h:137
T AddPct(T &base, U pct)
Definition Util.h:58
void UpdateUnitMod(UnitMods unitMod)
Definition Unit.cpp:15412

References AddPct(), BASE_PCT, LOG_ERROR, m_auraPctModifiersGroup, MODIFIER_TYPE_PCT_END, TOTAL_PCT, UNIT_MOD_END, and UpdateUnitMod().

Referenced by boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleModPercentStat(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14756{
14757 if (!HasThreatAura() || fThreat < 0)
14758 return fThreat;
14759
14760 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14761
14762 return fThreat * m_threatModifier[school];
14763}
SpellSchools
Definition SharedDefines.h:293
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:329
bool HasThreatAura() const
Definition Unit.h:1811

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10458{
10459 if (!victim || victim == this)
10460 return false;
10461
10462 // dead units can neither attack nor be attacked
10463 if (!IsAlive() || !victim->IsAlive())
10464 return false;
10465
10466 // pussywizard: check map, world, phase >_> multithreading crash fix
10467 if (!IsInMap(victim) || !InSamePhase(victim))
10468 return false;
10469
10470 // player cannot attack in mount state
10471 if (IsPlayer() && IsMounted())
10472 return false;
10473
10474 // creatures cannot attack while evading
10475 Creature* creature = ToCreature();
10476 if (creature && creature->IsInEvadeMode())
10477 {
10478 return false;
10479 }
10480
10481 // creatures should not try to attack the player during polymorph
10482 if (creature && creature->IsPolymorphed())
10483 {
10484 return false;
10485 }
10486
10487 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10488 // return false;
10489
10490 // nobody can attack GM in GM-mode
10491 if (victim->IsPlayer())
10492 {
10493 if (victim->ToPlayer()->IsGameMaster())
10494 return false;
10495 }
10496 else
10497 {
10498 if (victim->ToCreature()->IsEvadingAttacks())
10499 return false;
10500 }
10501
10502 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10504 return false;
10505
10506 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10507 if (HasUnattackableAura())
10509
10510 if (m_attacking)
10511 {
10512 if (m_attacking == victim)
10513 {
10514 // switch to melee attack from ranged/magic
10515 if (meleeAttack)
10516 {
10518 {
10520 SendMeleeAttackStart(victim);
10521 return true;
10522 }
10523 }
10525 {
10527 SendMeleeAttackStop(victim);
10528 return true;
10529 }
10530 return false;
10531 }
10532
10533 // switch target
10534 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10535 if (!meleeAttack)
10537 }
10538
10539 if (m_attacking)
10541
10542 m_attacking = victim;
10544
10545 // Set our target
10546 SetTarget(victim->GetGUID());
10547
10548 if (meleeAttack)
10550
10551 Unit* owner = GetCharmerOrOwner();
10552 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10553 Creature* controlledCreatureWithSameVictim = nullptr;
10554 if (creature && !m_Controlled.empty())
10555 {
10556 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10557 {
10558 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10559 {
10560 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10561 break;
10562 }
10563 }
10564 }
10565
10566 // Share leash timer with controlled unit
10567 if (controlledCreatureWithSameVictim)
10568 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10569 // Share leash timer with owner
10570 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10572 // Update leash timer when attacking creatures
10573 else if (victim->IsCreature())
10575
10576 // set position before any AI calls/assistance
10577 //if (IsCreature())
10578 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10579 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10580 {
10581 // should not let player enter combat by right clicking target - doesn't helps
10582 SetInCombatWith(victim);
10583 if (victim->IsPlayer())
10584 victim->SetInCombatWith(this);
10585
10586 AddThreat(victim, 0.0f);
10587
10589
10592 creature->CallAssistance();
10593
10595
10597 }
10598
10599 // delay offhand weapon attack by 50% of the base attack time
10602
10603 if (meleeAttack)
10604 SendMeleeAttackStart(victim);
10605
10606 return true;
10607}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1905
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3482
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:544
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:52
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition WorldConfig.h:237
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2385
bool IsEvadingAttacks() const
Definition Creature.h:139
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition Creature.cpp:3528
void UpdateLeashExtensionTime()
Definition Creature.cpp:3550
void SetAssistanceTimer(uint32 value)
Definition Creature.h:410
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition Creature.cpp:3535
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2373
bool IsInEvadeMode() const
Definition Creature.h:138
bool IsGameMaster() const
Definition Player.h:1175
bool HasOffhandWeaponForAttack() const
Definition Unit.h:975
void ClearUnitState(uint32 f)
Definition Unit.h:727
bool IsPolymorphed() const
Definition Unit.cpp:16982
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14767
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2212
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2211
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13741
bool HasUnattackableAura() const
Definition Unit.h:1813
Unit * GetCharmerOrOwner() const
Definition Unit.h:1271
bool IsMounted() const
Definition Unit.h:1866
Unit * GetVictim() const
Definition Unit.h:893
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3095
bool IsControllableGuardian() const
Definition Unit.h:786
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21425
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3111
bool IsControlledByPlayer() const
Definition Unit.h:1292
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1784
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:513
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1311
#define sWorld
Definition World.h:316

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::AttackStart(), npc_nexus_lord::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::AttackStart(), boss_mimiron::AttackStart(), npc_ulduar_aerial_command_unit::AttackStart(), boss_razorscale::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2598{
2600 {
2601 return;
2602 }
2603
2604 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2605 {
2606 return;
2607 }
2608
2609 if (!victim->IsAlive())
2610 return;
2611
2612 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2613 return;
2614
2615 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2616 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2617
2618 CombatStart(victim);
2620
2621 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2622 return; // ignore ranged case
2623
2624 if (!extra && _lastExtraAttackSpell)
2625 {
2627 }
2628
2629 bool meleeAttack = true;
2630
2631 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2632 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2633 {
2634 meleeAttack = false; // The melee attack is replaced by the melee spell
2635
2637 SpellCastResult castResult = meleeSpell->CheckCast(false);
2638 if (castResult != SPELL_CAST_OK)
2639 {
2640 meleeSpell->SendCastResult(castResult);
2641 meleeSpell->SendInterrupted(0);
2642
2643 meleeSpell->finish(false);
2644 meleeSpell->SetExecutedCurrently(false);
2645
2646 if (castResult == SPELL_FAILED_NO_POWER)
2647 {
2648 // Not enough rage, do a regular melee attack instead
2649 meleeAttack = true;
2650 }
2651 }
2652 else
2653 {
2654 meleeSpell->cast(true);
2655 }
2656 }
2657 if (meleeAttack)
2658 {
2659 // attack can be redirected to another target
2660 victim = GetMeleeHitRedirectTarget(victim);
2661 CalcDamageInfo damageInfo;
2662 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2663
2664 // Send log damage message to client
2665 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2666 {
2667 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2668 }
2669
2670 // Related to sparring system. Allow attack animations even if there are no damages
2671 if (victim->CanSparringWith(damageInfo.attacker))
2672 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2673
2674 SendAttackStateUpdate(&damageInfo);
2675
2676 //TriggerAurasProcOnEvent(damageInfo);
2677
2678 _lastDamagedTargetGuid = victim->GetGUID();
2679
2680 DealMeleeDamage(&damageInfo, true);
2681
2682 DamageInfo dmgInfo(damageInfo);
2683 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2684 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2685
2686 if (IsPlayer())
2687 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2688 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2689 else
2690 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2691 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2692
2693 // Let the pet know we've started attacking someting. Handles melee attacks only
2694 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2695 if (IsPlayer() && !m_Controlled.empty())
2696 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2697 if (Unit* pet = *itr)
2698 if (pet->IsAlive() && pet->IsCreature())
2699 pet->ToCreature()->AI()->OwnerAttacked(victim);
2700 }
2701}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1045
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:218
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:271
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:123
Definition Unit.h:337
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3720
void SetExecutedCurrently(bool yes)
Definition Spell.h:573
void SendInterrupted(uint8 result)
Definition Spell.cpp:5123
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4618
void finish(bool ok=true)
Definition Spell.cpp:4426
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6712
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13786
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11273
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1496
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:6611
uint8 getStandState() const
Definition Unit.h:1760
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1861
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3983
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:814
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1373
Definition Unit.h:470
uint32 procAttacker
Definition Unit.h:487
uint32 procVictim
Definition Unit.h:488
uint32 absorb
Definition Unit.h:478
struct CalcDamageInfo::@269 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:477
uint32 procEx
Definition Unit.h:489
uint32 HitInfo
Definition Unit.h:483
Unit * attacker
Definition Unit.h:471
Unit * target
Definition Unit.h:472
WeaponAttackType attackType
Definition Unit.h:486
std::string ToString() const
Definition Position.cpp:59

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), boss_dred::boss_dredAI::ScheduleTasks(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_kologarn::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10614{
10615 if (!m_attacking)
10616 return false;
10617
10618 Unit* victim = m_attacking;
10619
10621 m_attacking = nullptr;
10622
10623 // Clear our target
10625
10627
10629
10630 // reset only at real combat stop
10631 if (Creature* creature = ToCreature())
10632 {
10633 creature->SetNoCallAssistance(false);
10634
10635 if (creature->HasSearchedAssistance())
10636 {
10637 creature->SetNoSearchAssistance(false);
10638 }
10639 }
10640
10641 SendMeleeAttackStop(victim);
10642
10643 return true;
10644}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), ChaseMovementGenerator< T >::DispatchSplineToPosition(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), npc_crystalline_frayer::EnterSeedPod(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_talon_king_ikiss::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_attumen::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_hadronox::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_mimiron::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10747{
10749 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10750 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10751 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10752 auraStates |= (1 << (itr->first - 1));
10753
10754 return auraStates;
10755}
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
21098{
21099 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
21100 data << GetGUID();
21101 data << uint8(flags);
21102 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
21103 {
21104 data << uint32(itr->first);
21105 data << uint32(itr->second);
21106 }
21107}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2077{
2078 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2079 *data << GetPackGUID();
2080 BuildMovementPacket(data);
2081}
PackedGuid const & GetPackGUID() const
Definition Object.h:115
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19886
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19887{
19888 *data << uint32(GetUnitMovementFlags()); // movement flags
19889 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19890 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19891 *data << GetPositionX();
19892 *data << GetPositionY();
19893 *data << GetPositionZ();
19894 *data << GetOrientation();
19895
19896 // 0x00000200
19898 {
19899 if (m_vehicle)
19900 *data << m_vehicle->GetBase()->GetPackGUID();
19901 else if (GetTransport())
19902 *data << GetTransport()->GetPackGUID();
19903 else
19904 *data << (uint8)0;
19905
19906 *data << float (GetTransOffsetX());
19907 *data << float (GetTransOffsetY());
19908 *data << float (GetTransOffsetZ());
19909 *data << float (GetTransOffsetO());
19910 *data << uint32(GetTransTime());
19911 *data << uint8 (GetTransSeat());
19912
19915 }
19916
19917 // 0x02200000
19920 *data << (float)m_movementInfo.pitch;
19921
19922 *data << (uint32)m_movementInfo.fallTime;
19923
19924 // 0x00001000
19926 {
19927 *data << (float)m_movementInfo.jump.zspeed;
19928 *data << (float)m_movementInfo.jump.sinAngle;
19929 *data << (float)m_movementInfo.jump.cosAngle;
19930 *data << (float)m_movementInfo.jump.xyspeed;
19931 }
19932
19933 // 0x04000000
19935 *data << (float)m_movementInfo.splineElevation;
19936}
std::uint16_t uint16
Definition Define.h:108
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:394
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:381
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:395
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:432
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:437
uint32 GetUnitMovementFlags() const
Definition Unit.h:765
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:771
float GetTransOffsetX() const
Definition Object.h:684
float GetTransOffsetY() const
Definition Object.h:685
float GetTransOffsetZ() const
Definition Object.h:686
uint32 GetTransTime() const
Definition Object.h:688
Transport * GetTransport() const
Definition Object.h:683
float GetTransOffsetO() const
Definition Object.h:687
float cosAngle
Definition Object.h:328
float xyspeed
Definition Object.h:328
float zspeed
Definition Object.h:328
float sinAngle
Definition Object.h:328
uint32 time2
Definition Object.h:311
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:318
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:332
float pitch
Definition Object.h:315

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), and SendTeleportPacket().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20811{
20812 if (!target)
20813 return;
20814
20816 uint32 visibleFlag = UF_FLAG_PUBLIC;
20817
20818 if (target == this)
20819 visibleFlag |= UF_FLAG_PRIVATE;
20820
20822 if (GetOwnerGUID() == target->GetGUID())
20823 visibleFlag |= UF_FLAG_OWNER;
20824
20827 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20828
20829 if (plr && plr->IsInSameRaidWith(target))
20830 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20831
20832 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20833
20834 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20835 if (cacheIt != _valuesUpdateCache.end())
20836 {
20837 int32 cachePos = static_cast<int32>(data->wpos());
20838 data->append(cacheIt->second.buffer);
20839
20840 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20841 if (cachePos)
20842 dataAdjustedPos.ApplyOffset(cachePos);
20843
20844 PatchValuesUpdate(*data, dataAdjustedPos, target);
20845
20846 return;
20847 }
20848
20849 BuildValuesCachedBuffer cacheValue(500);
20850
20851 ByteBuffer fieldBuffer(400);
20852
20853 UpdateMask updateMask;
20854 updateMask.SetCount(m_valuesCount);
20855
20856 for (uint16 index = 0; index < m_valuesCount; ++index)
20857 {
20858 if (_fieldNotifyFlags & flags[index] ||
20859 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20860 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20862 {
20863 updateMask.SetBit(index);
20864
20865 if (index == UNIT_NPC_FLAGS)
20866 {
20867 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20868 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20869 }
20870 else if (index == UNIT_FIELD_AURASTATE)
20871 {
20872 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20873 fieldBuffer << uint32(0); // Fill in later.
20874 }
20875 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20876 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20877 {
20878 // convert from float to uint32 and send
20879 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20880 }
20881 // there are some float values which may be negative or can't get negative due to other checks
20882 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20885 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20886 {
20887 fieldBuffer << uint32(m_floatValues[index]);
20888 }
20889 // Gamemasters should be always able to select units - remove not selectable flag
20890 else if (index == UNIT_FIELD_FLAGS)
20891 {
20892 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20893 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20894 }
20895 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20896 else if (index == UNIT_FIELD_DISPLAYID)
20897 {
20898 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20899 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20900 }
20901 else if (index == UNIT_DYNAMIC_FLAGS)
20902 {
20903 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20905 fieldBuffer << dynamicFlags;
20906 }
20907 else if (index == UNIT_FIELD_BYTES_2)
20908 {
20909 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20910 fieldBuffer << m_uint32Values[index];
20911 }
20912 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20913 {
20914 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20915 fieldBuffer << m_uint32Values[index];
20916 }
20917 else
20918 {
20919 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20920 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20921
20922 // send in current format (float as float, uint32 as uint32)
20923 fieldBuffer << m_uint32Values[index];
20924 }
20925 }
20926 }
20927
20928 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20929 updateMask.AppendToPacket(&cacheValue.buffer);
20930 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20931 cacheValue.buffer.append(fieldBuffer);
20932 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20933
20934 int32 cachePos = static_cast<int32>(data->wpos());
20935 data->append(cacheValue.buffer);
20936
20937 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20938 if (cachePos)
20939 dataAdjustedPos.ApplyOffset(cachePos);
20940
20941 PatchValuesUpdate(*data, dataAdjustedPos, target);
20942
20943 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20944}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3365
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3364
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3363
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ UPDATETYPE_VALUES
Definition UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition UpdateFields.h:139
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition UpdateFields.h:157
@ UNIT_FIELD_POSSTAT0
Definition UpdateFields.h:146
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_FIELD_NEGSTAT0
Definition UpdateFields.h:151
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition UpdateFields.h:158
@ UNIT_DYNAMIC_FLAGS
Definition UpdateFields.h:136
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:267
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:263
uint32 * m_uint32Values
Definition Object.h:259
uint16 m_valuesCount
Definition Object.h:265
float * m_floatValues
Definition Object.h:260
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1900
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2243
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5859
ObjectGuid GetOwnerGUID() const
Definition Unit.h:703
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20946
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2184{
2185 Unit* victim = dmgInfo.GetVictim();
2186 Unit* attacker = dmgInfo.GetAttacker();
2187 uint32 damage = dmgInfo.GetDamage();
2188 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2189 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2190
2191 if (!victim || !victim->IsAlive() || !damage)
2192 return;
2193
2194 // Magic damage, check for resists
2195 // Ignore spells that cant be resisted
2196 // Xinef: holy resistance exists for npcs
2197 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2198 {
2199 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2200
2201 float discreteResistProbability[11];
2202 for (uint32 i = 0; i < 11; ++i)
2203 {
2204 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2205 if (discreteResistProbability[i] < 0.0f)
2206 discreteResistProbability[i] = 0.0f;
2207 }
2208
2209 if (averageResist <= 0.1f)
2210 {
2211 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2212 discreteResistProbability[1] = 5.0f * averageResist;
2213 discreteResistProbability[2] = 2.5f * averageResist;
2214 }
2215
2216 float r = float(rand_norm());
2217 uint32 i = 0;
2218 float probabilitySum = discreteResistProbability[0];
2219
2220 while (r >= probabilitySum && i < 10)
2221 probabilitySum += discreteResistProbability[++i];
2222
2223 float damageResisted = float(damage * i / 10);
2224
2225 if (damageResisted) // if equal to 0, checking these is pointless
2226 {
2227 if (attacker)
2228 {
2229 float mult = attacker->GetTotalAuraMultiplier(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, [schoolMask, spellInfo](AuraEffect const* aurEff)
2230 {
2231 if (!(aurEff->GetMiscValue() & schoolMask))
2232 return false;
2233
2234 if (!aurEff->IsAffectedOnSpell(spellInfo))
2235 return false;
2236
2237 return true;
2238 });
2239 damageResisted -= damageResisted * (mult - 1.0f);
2241 damageResisted -= damageResisted * (mult - 1.0f);
2242 }
2243
2244 // pussywizard:
2245 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2246 {
2247 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2248 uint32 armorReduction = damage - damageAfterArmor;
2249 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2250 damageResisted = armorReduction;
2251 }
2252 }
2253
2254 dmgInfo.ResistDamage(uint32(damageResisted));
2255 }
2256
2257 // Ignore Absorption Auras
2258 float auraAbsorbMod = 0;
2259 if (attacker)
2260 {
2262 auraAbsorbMod = std::max(auraAbsorbMod, float(attacker->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, [spellInfo, schoolMask](AuraEffect const* aurEff)
2263 {
2264 if (!(aurEff->GetMiscValue() & schoolMask))
2265 return false;
2266
2267 if (!aurEff->IsAffectedOnSpell(spellInfo))
2268 return false;
2269
2270 return true;
2271 })));
2272 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2273 }
2274
2275 // We're going to call functions which can modify content of the list during iteration over it's elements
2276 // Let's copy the list so we can prevent iterator invalidation
2278 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2279
2280 // absorb without mana cost
2281 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2282 {
2283 AuraEffect* absorbAurEff = *itr;
2284 // Check if aura was removed during iteration - we don't need to work on such auras
2285 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2286 if (!aurApp)
2287 continue;
2288 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2289 continue;
2290
2291 // get amount which can be still absorbed by the aura
2292 int32 currentAbsorb = absorbAurEff->GetAmount();
2293 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2294 if (currentAbsorb < 0)
2295 currentAbsorb = 0;
2296
2297 uint32 tempAbsorb = uint32(currentAbsorb);
2298
2299 bool defaultPrevented = false;
2300
2301 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2302 currentAbsorb = tempAbsorb;
2303
2304 if (defaultPrevented)
2305 continue;
2306
2307 // absorb must be smaller than the damage itself
2308 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2309
2310 // xinef: do this after absorb is rounded to damage...
2311 AddPct(currentAbsorb, -auraAbsorbMod);
2312
2313 dmgInfo.AbsorbDamage(currentAbsorb);
2314
2315 tempAbsorb = currentAbsorb;
2316 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2317
2318 // Check if our aura is using amount to count damage
2319 if (absorbAurEff->GetAmount() >= 0)
2320 {
2321 // Reduce shield amount
2322 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2323 // Aura cannot absorb anything more - remove it
2324 if (absorbAurEff->GetAmount() <= 0)
2325 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2326 }
2327 }
2328
2329 // absorb by mana cost
2331 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2332 {
2333 AuraEffect* absorbAurEff = *itr;
2334 // Check if aura was removed during iteration - we don't need to work on such auras
2335 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2336 if (!aurApp)
2337 continue;
2338 // check damage school mask
2339 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2340 continue;
2341
2342 // get amount which can be still absorbed by the aura
2343 int32 currentAbsorb = absorbAurEff->GetAmount();
2344 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2345 if (currentAbsorb < 0)
2346 currentAbsorb = 0;
2347
2348 uint32 tempAbsorb = currentAbsorb;
2349
2350 bool defaultPrevented = false;
2351
2352 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2353 currentAbsorb = tempAbsorb;
2354
2355 if (defaultPrevented)
2356 continue;
2357
2358 // absorb must be smaller than the damage itself
2359 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2360
2361 // xinef: do this after absorb is rounded to damage...
2362 AddPct(currentAbsorb, -auraAbsorbMod);
2363
2364 int32 manaReduction = currentAbsorb;
2365
2366 // lower absorb amount by talents
2367 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2368 manaReduction = int32(float(manaReduction) * manaMultiplier);
2369
2370 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2371
2372 // take case when mana has ended up into account
2373 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2374
2375 dmgInfo.AbsorbDamage(currentAbsorb);
2376
2377 tempAbsorb = currentAbsorb;
2378 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2379
2380 // Check if our aura is using amount to count damage
2381 if (absorbAurEff->GetAmount() >= 0)
2382 {
2383 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2384 if ((absorbAurEff->GetAmount() <= 0))
2385 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2386 }
2387 }
2388
2389 // split damage auras - only when not damaging self
2390 // Xinef: not true - Warlock Hellfire
2391 if (/*victim != attacker &&*/ !Splited)
2392 {
2393 // We're going to call functions which can modify content of the list during iteration over it's elements
2394 // Let's copy the list so we can prevent iterator invalidation
2395 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2396 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2397 {
2398 // Check if aura was removed during iteration - we don't need to work on such auras
2399 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2400 continue;
2401 // check damage school mask
2402 if (!((*itr)->GetMiscValue() & schoolMask))
2403 continue;
2404
2405 // Damage can be splitted only if aura has an alive caster
2406 Unit* caster = (*itr)->GetCaster();
2407 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2408 continue;
2409
2410 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2411 // Ignore LOS attribute is only used for the cast portion of the spell
2412 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2413 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2414 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2415 continue;
2416
2417 int32 splitDamage = (*itr)->GetAmount();
2418
2419 // absorb must be smaller than the damage itself
2420 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2421
2422 dmgInfo.AbsorbDamage(splitDamage);
2423
2424 uint32 splitted = splitDamage;
2425 uint32 splitted_absorb = 0;
2426 uint32 splitted_resist = 0;
2427
2428 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2429 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2430 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2431 {
2432 procEx |= PROC_EX_IMMUNE;
2433 splittedDmgInfo.AbsorbDamage(splitted);
2434 }
2435 else
2436 {
2437 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2438 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2439 }
2440
2441 splitted_absorb = splittedDmgInfo.GetAbsorb();
2442 splitted_resist = splittedDmgInfo.GetResist();
2443 splitted = splittedDmgInfo.GetDamage();
2444
2445 // create procs
2446 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2447 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2448
2449 if (attacker)
2450 {
2451 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2452 }
2453
2454 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2455 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2456 }
2457
2458 // We're going to call functions which can modify content of the list during iteration over it's elements
2459 // Let's copy the list so we can prevent iterator invalidation
2461 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2462 {
2463 // Check if aura was removed during iteration - we don't need to work on such auras
2464 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2465 if (!aurApp)
2466 continue;
2467
2468 // check damage school mask
2469 if (!((*itr)->GetMiscValue() & schoolMask))
2470 continue;
2471
2472 // Damage can be splitted only if aura has an alive caster
2473 Unit* caster = (*itr)->GetCaster();
2474 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2475 continue;
2476
2477 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2478 // Ignore LOS attribute is only used for the cast portion of the spell
2479 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2480 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2481 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2482 continue;
2483
2484 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2485 SpellSchoolMask splitSchoolMask = schoolMask;
2486
2487 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2488
2489 // absorb must be smaller than the damage itself
2490 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2491
2492 // Roar of Sacrifice, dont absorb it
2493 if (splitSpellInfo->Id != 53480)
2494 dmgInfo.AbsorbDamage(splitDamage);
2495 else
2496 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2497
2498 uint32 splitted = splitDamage;
2499 uint32 splitted_absorb = 0;
2500 uint32 splitted_resist = 0;
2501
2502 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2503 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2504 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2505 {
2506 procEx |= PROC_EX_IMMUNE;
2507 splittedDmgInfo.AbsorbDamage(splitted);
2508 }
2509 else
2510 {
2511 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2512 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2513 }
2514
2515 splitted_absorb = splittedDmgInfo.GetAbsorb();
2516 splitted_resist = splittedDmgInfo.GetResist();
2517 splitted = splittedDmgInfo.GetDamage();
2518
2519 // create procs
2520 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2521 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2522
2523 if (attacker)
2524 {
2525 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2526 }
2527
2528 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2529 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2530 }
2531 }
2532}
double rand_norm()
Definition Random.cpp:85
@ POWER_MANA
Definition SharedDefines.h:280
@ SPELL_ATTR4_NO_CAST_LOG
Definition SharedDefines.h:541
SpellSchoolMask
Definition SharedDefines.h:306
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:308
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:311
@ SPELL_SCHOOL_MASK_HOLY
Definition SharedDefines.h:309
@ SPELL_AURA_MANA_SHIELD
Definition SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:16150
@ DIRECT_DAMAGE
Definition Unit.h:255
@ MELEE_HIT_NORMAL
Definition Unit.h:293
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:70
Definition SpellAuraEffects.h:347
Definition SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
bool IsAffectedOnSpell(SpellInfo const *spell) const
Definition SpellAuraEffects.cpp:1092
void SetAmount(int32 amount)
Definition SpellAuraEffects.h:66
Unit * GetCaster() const
Definition SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2483
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2501
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2515
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2529
void ResistDamage(uint32 amount)
Definition Unit.cpp:161
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:154
Unit * GetVictim() const
Definition Unit.h:366
Unit * GetAttacker() const
Definition Unit.h:365
SpellInfo const * GetSpellInfo() const
Definition Unit.h:367
DamageEffectType GetDamageType() const
Definition Unit.h:369
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:368
uint32 GetDamage() const
Definition Unit.h:371
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2217
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14331
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6173
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1413
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:671
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition Unit.cpp:2067
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2149
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6138
int32 GetMaxPositiveAuraModifier(AuraType auratype) const
Definition Unit.cpp:6143
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6544
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:16284
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6163
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:13076
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2183
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:824
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1342
Definition Unit.h:322

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByMiscMask(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealDamageShieldDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2068{
2069 float armor = float(victim->GetArmor());
2070
2071 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2072 if (attacker)
2073 {
2074 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2075
2076 if (spellInfo)
2077 if (Player* modOwner = attacker->GetSpellModOwner())
2078 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2079
2080 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2081 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2082 {
2083 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2084 && (*j)->IsAffectedOnSpell(spellInfo))
2085 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2086 }
2087
2088 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2089 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2090 {
2091 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2092 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2093 }
2094
2095 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2096 if (attacker->IsPlayer())
2097 {
2098 float bonusPct = 0;
2099 bonusPct += attacker->GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, [spellInfo,attacker](AuraEffect const* aurEff)
2100 {
2101 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
2102 {
2103 if (!spellInfo || aurEff->IsAffectedOnSpell(spellInfo) || aurEff->GetMiscValue() & spellInfo->GetSchoolMask())
2104 return true;
2105 else if (!aurEff->GetMiscValue() && !aurEff->HasSpellClassMask())
2106 return true;
2107 }
2108 else
2109 {
2110 if (attacker->ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
2111 return true;
2112 }
2113 return false;
2114 });
2115
2116 float maxArmorPen = 0;
2117 if (victim->GetLevel() < 60)
2118 maxArmorPen = float(400 + 85 * victim->GetLevel());
2119 else
2120 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2121
2122 // Cap armor penetration to this number
2123 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2124 // Figure out how much armor do we ignore
2125 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2126 // Got the value, apply it
2127 armor -= std::min(armorPen, maxArmorPen);
2128 }
2129 }
2130
2131 if (armor < 0.0f)
2132 armor = 0.0f;
2133
2134 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2135 if (levelModifier > 59)
2136 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2137
2138 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2139 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2140
2141 if (tmpvalue < 0.0f)
2142 tmpvalue = 0.0f;
2143 if (tmpvalue > 0.75f)
2144 tmpvalue = 0.75f;
2145
2146 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2147}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:248
bool HasSpellClassMask() const
Definition SpellAuraEffects.cpp:1106
int32 EquippedItemClass
Definition SpellInfo.h:375

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, SpellInfo::EquippedItemClass, GetArmor(), GetAuraEffectsByType(), GetLevel(), AuraEffect::GetMiscValue(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), AuraEffect::HasSpellClassMask(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2535{
2536 if (!healInfo.GetHeal())
2537 return;
2538
2539 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2540 int32 absorbAmount = 0;
2541
2542 // Need remove expired auras after
2543 bool existExpired = false;
2544
2545 // absorb without mana cost
2547 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2548 {
2549 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2550 continue;
2551
2552 // Max Amount can be absorbed by this aura
2553 int32 currentAbsorb = (*i)->GetAmount();
2554
2555 // Found empty aura (impossible but..)
2556 if (currentAbsorb <= 0)
2557 {
2558 existExpired = true;
2559 continue;
2560 }
2561
2562 // currentAbsorb - damage can be absorbed by shield
2563 // If need absorb less damage
2564 if (healing < currentAbsorb + absorbAmount)
2565 currentAbsorb = healing - absorbAmount;
2566
2567 absorbAmount += currentAbsorb;
2568
2569 // Reduce shield amount
2570 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2571 // Need remove it later
2572 if ((*i)->GetAmount() <= 0)
2573 existExpired = true;
2574 }
2575
2576 // Remove all expired absorb auras
2577 if (existExpired)
2578 {
2579 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2580 {
2581 AuraEffect* auraEff = *i;
2582 ++i;
2583 if (auraEff->GetAmount() <= 0)
2584 {
2585 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2587 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2588 i = vHealAbsorb.begin();
2589 }
2590 }
2591 }
2592
2593 if (absorbAmount > 0)
2594 healInfo.AbsorbHeal(absorbAmount);
2595}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:422
void AbsorbHeal(uint32 amount)
Definition Unit.h:397
Unit * GetTarget() const
Definition Unit.h:418
uint32 GetHeal() const
Definition Unit.h:419
uint32 SchoolMask
Definition SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14971{
14972 uint8 comboPoints = GetComboPoints();
14973
14974 int32 minduration = spellProto->GetDuration();
14975 int32 maxduration = spellProto->GetMaxDuration();
14976
14977 int32 duration;
14978
14979 if (comboPoints && minduration != -1 && minduration != maxduration)
14980 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14981 else
14982 duration = minduration;
14983
14984 return duration;
14985}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:999

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20381{
20382 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20383 if (npcCaster)
20385
20386 return damage;
20387}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:292

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3019{
3020 float minDamage = 0.0f;
3021 float maxDamage = 0.0f;
3022
3023 if (normalized || !addTotalPct || itemDamagesMask)
3024 {
3025 // get both by default
3026 if (!itemDamagesMask)
3027 {
3028 itemDamagesMask = (1 << 0) | (1 << 1);
3029 }
3030
3031 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3032 {
3033 if (itemDamagesMask & (1 << i))
3034 {
3035 float minTmp, maxTmp;
3036 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3037 minDamage += minTmp;
3038 maxDamage += maxTmp;
3039 }
3040 }
3041 }
3042 else
3043 {
3044 switch (attType)
3045 {
3046 case RANGED_ATTACK:
3049 break;
3050 case BASE_ATTACK:
3053 break;
3054 case OFF_ATTACK:
3057 break;
3058 default:
3059 break;
3060 }
3061 }
3062
3063 minDamage = std::max(0.f, minDamage);
3064 maxDamage = std::max(0.f, maxDamage);
3065
3066 if (minDamage > maxDamage)
3067 {
3068 std::swap(minDamage, maxDamage);
3069 }
3070
3071 return urand(uint32(minDamage), uint32(maxDamage));
3072}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17450{
17451 // Damage over Time spells bonus calculation
17452 float DotFactor = 1.0f;
17453 if (damagetype == DOT)
17454 {
17455 int32 DotDuration = spellInfo->GetDuration();
17456 if (!spellInfo->IsChanneled() && DotDuration > 0)
17457 DotFactor = DotDuration / 15000.0f;
17458
17459 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17460 DotFactor /= DotTicks;
17461 }
17462
17463 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17464 // Distribute Damage over multiple effects, reduce by AoE
17465 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17466
17467 // As wowwiki says: C = (Cast Time / 3.5)
17468 return (CastingTime / 3500.0f) * DotFactor;
17469}
@ DOT
Definition Unit.h:257
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17331

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3075{
3076 if (!IsPlayer())
3077 return 1.0f;
3078
3079 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3080 return 1.0f;
3081
3082 float LvlPenalty = 0.0f;
3083
3084 // xinef: added brackets
3085 if (spellProto->SpellLevel < 20)
3086 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3087
3088 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3089 if (LvlFactor > 1.0f)
3090 LvlFactor = 1.0f;
3091
3092 return AddPct(LvlFactor, -LvlPenalty);
3093}
uint8 GetLevel() const
Definition Unit.h:1088

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), and SpellHealingBonusTaken().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1497{
1498 damageInfo->attacker = this;
1499 damageInfo->target = victim;
1500
1501 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1502 {
1503 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1504 damageInfo->damages[i].damage = 0;
1505 damageInfo->damages[i].absorb = 0;
1506 damageInfo->damages[i].resist = 0;
1507 }
1508
1509 damageInfo->attackType = attackType;
1510 damageInfo->cleanDamage = 0;
1511 damageInfo->blocked_amount = 0;
1512
1513 damageInfo->TargetState = 0;
1514 damageInfo->HitInfo = 0;
1515 damageInfo->procAttacker = PROC_FLAG_NONE;
1516 damageInfo->procVictim = PROC_FLAG_NONE;
1517 damageInfo->procEx = PROC_EX_NONE;
1518 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1519
1520 if (!victim)
1521 return;
1522
1523 if (!IsAlive() || !victim->IsAlive())
1524 return;
1525
1526 // Select HitInfo/procAttacker/procVictim flag based on attack type
1527 switch (attackType)
1528 {
1529 case BASE_ATTACK:
1532 break;
1533 case OFF_ATTACK:
1536 damageInfo->HitInfo = HITINFO_OFFHAND;
1537 break;
1538 default:
1539 return;
1540 }
1541
1542 // School Immune check
1543 uint8 immunedMask = 0;
1544 bool hasNonPhysicalSchoolMask = false;
1545 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1546 {
1548 {
1549 immunedMask |= (1 << i);
1551 {
1552 hasNonPhysicalSchoolMask = true;
1553 }
1554 }
1555 }
1556
1557 // School Immune check
1558 if (immunedMask & ((1 << 0) | (1 << 1)))
1559 {
1560 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1561 {
1562 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1563 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1564
1565 damageInfo->procEx |= PROC_EX_IMMUNE;
1566 return;
1567 }
1568 }
1569
1570 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1571 {
1572 // only players have secondary weapon damage
1573 if (i > 0 && !IsPlayer())
1574 {
1575 break;
1576 }
1577
1578 if (immunedMask & (1 << i))
1579 {
1580 continue;
1581 }
1582
1583 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1584 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1585
1586 uint32 damage = 0;
1587 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1588
1589 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1590 // Add melee damage bonus
1591 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1592 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1593
1594 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1595 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1596
1597 if (victim->GetAI())
1598 {
1599 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1600 }
1601
1602 // Calculate armor reduction
1604 {
1605 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1606 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1607 }
1608 else
1609 {
1610 damageInfo->damages[i].damage = damage;
1611 }
1612 }
1613
1614 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1615
1616 // If the victim was a sitting player and we didn't roll a miss, then crit.
1617 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1618 {
1619 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1620 }
1621 switch (damageInfo->hitOutCome)
1622 {
1623 case MELEE_HIT_EVADE:
1625 damageInfo->TargetState = VICTIMSTATE_EVADES;
1626 damageInfo->procEx |= PROC_EX_EVADE;
1627
1628 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1629 {
1630 damageInfo->damages[i].damage = 0;
1631 }
1632
1633 damageInfo->cleanDamage = 0;
1634 return;
1635 case MELEE_HIT_MISS:
1636 damageInfo->HitInfo |= HITINFO_MISS;
1637 damageInfo->TargetState = VICTIMSTATE_INTACT;
1638 damageInfo->procEx |= PROC_EX_MISS;
1639
1640 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1641 {
1642 damageInfo->damages[i].damage = 0;
1643 }
1644 damageInfo->cleanDamage = 0;
1645 break;
1646 case MELEE_HIT_NORMAL:
1647 damageInfo->TargetState = VICTIMSTATE_HIT;
1648 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1649 break;
1650 case MELEE_HIT_CRIT:
1651 {
1652 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1653 damageInfo->TargetState = VICTIMSTATE_HIT;
1654
1655 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1656 // Crit bonus calc
1657 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1658 {
1659 damageInfo->damages[i].damage *= 2;
1660
1661 float mod = 0.0f;
1662 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1663 if (damageInfo->attackType == RANGED_ATTACK)
1664 {
1666 }
1667 else
1668 {
1670
1671 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1673 }
1674
1675 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1676
1677 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1679 if (mod != 0)
1680 {
1681 AddPct(damageInfo->damages[i].damage, mod);
1682 }
1683 }
1684 break;
1685 }
1686 case MELEE_HIT_PARRY:
1687 damageInfo->TargetState = VICTIMSTATE_PARRY;
1688 damageInfo->procEx |= PROC_EX_PARRY;
1689 damageInfo->cleanDamage = 0;
1690
1691 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1692 {
1693 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1694 damageInfo->damages[i].damage = 0;
1695 }
1696 break;
1697 case MELEE_HIT_DODGE:
1698 damageInfo->TargetState = VICTIMSTATE_DODGE;
1699 damageInfo->procEx |= PROC_EX_DODGE;
1700 damageInfo->cleanDamage = 0;
1701
1702 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1703 {
1704 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1705 damageInfo->damages[i].damage = 0;
1706 }
1707 break;
1708 case MELEE_HIT_BLOCK:
1709 {
1710 damageInfo->TargetState = VICTIMSTATE_HIT;
1711 damageInfo->HitInfo |= HITINFO_BLOCK;
1712 damageInfo->procEx |= PROC_EX_BLOCK;
1713 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1714 // double blocked amount if block is critical
1715 if (damageInfo->target->isBlockCritical())
1716 damageInfo->blocked_amount += damageInfo->blocked_amount;
1717
1718 uint32 remainingBlock = damageInfo->blocked_amount;
1719 uint8 fullBlockMask = 0;
1720 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1721 {
1722 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1723 {
1724 fullBlockMask |= (1 << i);
1725
1726 remainingBlock -= damageInfo->damages[i].damage;
1727 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1728 damageInfo->damages[i].damage = 0;
1729 }
1730 else
1731 {
1732 damageInfo->cleanDamage += remainingBlock;
1733 damageInfo->damages[i].damage -= remainingBlock;
1734 remainingBlock = 0;
1735 }
1736 }
1737
1738 // full block
1739 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1740 {
1741 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1742 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1743 damageInfo->blocked_amount -= remainingBlock;
1744 }
1745 break;
1746 }
1747 case MELEE_HIT_GLANCING:
1748 {
1749 damageInfo->HitInfo |= HITINFO_GLANCING;
1750 damageInfo->TargetState = VICTIMSTATE_HIT;
1751 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1752 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1753 if (leveldif > 3)
1754 leveldif = 3;
1755 float reducePercent = 1 - leveldif * 0.1f;
1756
1757 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1758 {
1759 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1760 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1761 damageInfo->damages[i].damage = reducedDamage;
1762 }
1763 break;
1764 }
1765 case MELEE_HIT_CRUSHING:
1766 damageInfo->HitInfo |= HITINFO_CRUSHING;
1767 damageInfo->TargetState = VICTIMSTATE_HIT;
1768 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1769
1770 // 150% normal damage
1771 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1772 {
1773 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1774 }
1775 break;
1776 default:
1777 break;
1778 }
1779
1780 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1781 if (!(damageInfo->HitInfo & HITINFO_MISS))
1782 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1783
1784 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1785
1786 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1787 {
1788 int32 dmg = damageInfo->damages[i].damage;
1789 int32 cleanDamage = damageInfo->cleanDamage;
1790 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1791 if (CanApplyResilience())
1792 {
1793 int32 resilienceReduction = damageInfo->damages[i].damage;
1794 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1795
1796 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1797 dmg -= resilienceReduction;
1798 cleanDamage += resilienceReduction;
1799 }
1800
1801 damageInfo->damages[i].damage = std::max(0, dmg);
1802 damageInfo->cleanDamage = std::max(0, cleanDamage);
1803
1804 // Calculate absorb resist
1805 if (damageInfo->damages[i].damage > 0)
1806 {
1807 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1808
1809 // Calculate absorb & resists
1810 DamageInfo dmgInfo(*damageInfo, i);
1811 Unit::CalcAbsorbResist(dmgInfo);
1812 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1813 damageInfo->damages[i].resist = dmgInfo.GetResist();
1814
1815 if (damageInfo->damages[i].absorb)
1816 {
1817 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1818 }
1819
1820 if (damageInfo->damages[i].resist)
1821 {
1822 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1823 }
1824
1825 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1826 }
1827 }
1828
1829 // set proper HitInfo flags
1830 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1831 {
1832 // set partial absorb when secondary damage isn't full absorbed
1833 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1834 }
1835 else
1836 {
1837 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1838 }
1839
1840 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1841 {
1842 // set partial resist when secondary damage isn't full resisted
1843 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1844 }
1845 else
1846 {
1847 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1848 }
1849
1851 {
1852 damageInfo->procEx |= PROC_EX_ABSORB;
1853 }
1854
1855 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1856 {
1857 damageInfo->procEx |= PROC_EX_RESIST;
1858 }
1859}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition SpellMgr.h:193
@ PROC_EX_DODGE
Definition SpellMgr.h:198
@ PROC_EX_BLOCK
Definition SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition SpellMgr.h:195
@ PROC_EX_MISS
Definition SpellMgr.h:196
@ PROC_EX_RESIST
Definition SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition SpellMgr.h:207
@ PROC_EX_ABSORB
Definition SpellMgr.h:204
@ PROC_EX_PARRY
Definition SpellMgr.h:199
@ PROC_EX_EVADE
Definition SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition SpellMgr.h:141
@ PROC_FLAG_NONE
Definition SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition Unit.h:85
@ VICTIMSTATE_HIT
Definition Unit.h:86
@ VICTIMSTATE_DODGE
Definition Unit.h:87
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:92
@ VICTIMSTATE_PARRY
Definition Unit.h:88
@ VICTIMSTATE_BLOCKS
Definition Unit.h:90
@ VICTIMSTATE_EVADES
Definition Unit.h:91
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:105
@ HITINFO_FULL_RESIST
Definition Unit.h:106
@ HITINFO_NORMALSWING
Definition Unit.h:98
@ HITINFO_BLOCK
Definition Unit.h:112
@ HITINFO_CRUSHING
Definition Unit.h:116
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:120
@ HITINFO_MISS
Definition Unit.h:103
@ HITINFO_FULL_ABSORB
Definition Unit.h:104
@ HITINFO_OFFHAND
Definition Unit.h:101
@ HITINFO_GLANCING
Definition Unit.h:115
@ HITINFO_CRITICALHIT
Definition Unit.h:108
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:107
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:100
@ MELEE_HIT_CRUSHING
Definition Unit.h:293
@ MELEE_HIT_BLOCK
Definition Unit.h:292
@ MELEE_HIT_CRIT
Definition Unit.h:293
@ MELEE_HIT_EVADE
Definition Unit.h:292
@ MELEE_HIT_DODGE
Definition Unit.h:292
@ MELEE_HIT_MISS
Definition Unit.h:292
@ MELEE_HIT_PARRY
Definition Unit.h:292
@ MELEE_HIT_GLANCING
Definition Unit.h:293
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:380
bool isBlockCritical()
Definition Unit.cpp:3160
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13439
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6153
bool CanApplyResilience() const
Definition Unit.h:1156
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:3018
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:19185
UnitAI * GetAI()
Definition Unit.h:683
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2044
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:6133
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2817
uint32 GetCreatureTypeMask() const
Definition Unit.h:818
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13249
uint32 damageSchoolMask
Definition Unit.h:476
uint32 blocked_amount
Definition Unit.h:482
MeleeHitOutcome hitOutCome
Definition Unit.h:491
uint32 cleanDamage
Definition Unit.h:490
uint32 TargetState
Definition Unit.h:484
uint32 resist
Definition Unit.h:479

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1328{
1329 if (damage < 0)
1330 return;
1331
1332 Unit* victim = damageInfo->target;
1333 if (!victim || !victim->IsAlive())
1334 return;
1335
1336 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1337 uint32 crTypeMask = victim->GetCreatureTypeMask();
1338
1339 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1340 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1341
1342 if (victim->GetAI())
1343 {
1344 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1345 }
1346
1347 int32 cleanDamage = 0;
1348 if (!spellInfo->HasAttribute(SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS) && Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1349 {
1350 int32 oldDamage = damage;
1351 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1352 cleanDamage = oldDamage - damage;
1353 }
1354
1355 bool blocked = false;
1356 // Per-school calc
1357 switch (spellInfo->DmgClass)
1358 {
1359 // Melee and Ranged Spells
1362 {
1363 // Physical Damage
1364 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1365 {
1366 // Get blocked status
1367 blocked = isSpellBlocked(victim, spellInfo, attackType);
1368 }
1369
1370 if (crit)
1371 {
1372 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1373
1374 // Calculate crit bonus
1375 uint32 crit_bonus = damage;
1376 // Apply crit_damage bonus for melee spells
1377 if (Player* modOwner = GetSpellModOwner())
1378 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1379 damage += crit_bonus;
1380
1381 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1382 float critPctDamageMod = 0.0f;
1383 if (attackType == RANGED_ATTACK)
1385 else
1387
1388 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1389 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1390
1391 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1393
1394 if (critPctDamageMod != 0)
1395 AddPct(damage, critPctDamageMod);
1396 }
1397
1398 // Spell weapon based damage CAN BE crit & blocked at same time
1399 if (blocked)
1400 {
1401 damageInfo->blocked = victim->GetShieldBlockValue();
1402 // double blocked amount if block is critical
1403 if (victim->isBlockCritical())
1404 damageInfo->blocked *= 2;
1405 if (damage < int32(damageInfo->blocked))
1406 damageInfo->blocked = uint32(damage);
1407
1408 damage -= damageInfo->blocked;
1409 cleanDamage += damageInfo->blocked;
1410 }
1411
1412 int32 resilienceReduction = damage;
1413 if (CanApplyResilience())
1414 {
1415 if (attackType != RANGED_ATTACK)
1416 {
1417 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1418 }
1419 else
1420 {
1421 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1422 }
1423 }
1424
1425 resilienceReduction = damage - resilienceReduction;
1426 damage -= resilienceReduction;
1427 cleanDamage += resilienceReduction;
1428 break;
1429 }
1430 // Magical Attacks
1433 {
1434 // If crit add critical bonus
1435 if (crit)
1436 {
1437 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1438 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1439 }
1440
1441 int32 resilienceReduction = damage;
1442 if (CanApplyResilience())
1443 {
1444 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1445 }
1446
1447 resilienceReduction = damage - resilienceReduction;
1448 damage -= resilienceReduction;
1449 cleanDamage += resilienceReduction;
1450 break;
1451 }
1452 default:
1453 break;
1454 }
1455
1456 damageInfo->cleanDamage = std::max(0, cleanDamage);
1457 damageInfo->damage = std::max(0, damage);
1458
1459 // Calculate absorb resist
1460 if (damageInfo->damage > 0)
1461 {
1462 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1463 Unit::CalcAbsorbResist(dmgInfo);
1464 damageInfo->absorb = dmgInfo.GetAbsorb();
1465 damageInfo->resist = dmgInfo.GetResist();
1466 damageInfo->damage = dmgInfo.GetDamage();
1467 }
1468}
@ SPELL_DAMAGE_CLASS_RANGED
Definition SharedDefines.h:1559
@ SPELL_DAMAGE_CLASS_MAGIC
Definition SharedDefines.h:1557
@ SPELL_DAMAGE_CLASS_NONE
Definition SharedDefines.h:1556
@ SPELL_DAMAGE_CLASS_MELEE
Definition SharedDefines.h:1558
@ SPELL_HIT_TYPE_CRIT
Definition SharedDefines.h:1547
@ SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS
Definition SharedDefines.h:549
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:256
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:381
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3134
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12473
Unit * target
Definition Unit.h:502
uint32 HitInfo
Definition Unit.h:513
uint32 damage
Definition Unit.h:505
uint32 absorb
Definition Unit.h:508
Unit * attacker
Definition Unit.h:503
uint32 schoolMask
Definition Unit.h:507
uint32 cleanDamage
Definition Unit.h:515
uint32 resist
Definition Unit.h:509
uint32 blocked
Definition Unit.h:512

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1704 {
1707 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14729{
14730 // only creatures can have threat list
14731 if (!IsCreature())
14732 return false;
14733
14734 // only alive units can have threat list
14735 if (!skipAliveCheck && !IsAlive())
14736 return false;
14737
14738 // totems can not have threat list
14739 if (ToCreature()->IsTotem())
14740 return false;
14741
14742 // vehicles can not have threat list
14743 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14744 return false;
14745
14746 // summons can not have a threat list, unless they are controlled by a creature
14748 return false;
14749
14750 return true;
14751}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:790
Map * GetMap() const
Definition Object.h:620

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1572{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1542{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21336{
21337 // Aura of Despair exceptions
21338 switch (spellInfo->Id)
21339 {
21340 case 16666: // Demonic Rune
21341 case 27869: // Dark Rune
21342 case 30824: // Shamanistic Rage
21343 case 31786: // Spiritual Attunement
21344 case 31930: // Judgements of the Wise
21345 case 34075: // Aspect of the Viper
21346 case 34720: // Thrill of the hunt
21347 case 47755: // Rapture
21348 case 54425: // Improved Felhunter
21349 case 57319: // Blessing of Sanctuary
21350 case 63337: // Saronite Vapors (regenerate mana)
21351 case 63375: // Improved stormstrike
21352 case 64372: // Lifebloom
21353 case 68285: // Improved Leader of the Pack
21354 return true;
21355 case 54428: // Divine Plea - only with talent Guarded by the Light
21356 return HasSpell(53583);
21357 default:
21358 break;
21359 }
21360
21361 return false;
21362}
virtual bool HasSpell(uint32) const
Definition Unit.h:1567

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3984{
3986 return false;
3987
3988 if (!attacker)
3989 return false;
3990
3991 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
3992 return false;
3993
3994 if (Creature const* creature = ToCreature())
3995 if (!creature->GetSparringPct())
3996 return false;
3997
3998 return true;
3999}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1294

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19952{
19953 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19955 return false;
19957 return true;
19959 return false;
19961 return true;
19963}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:311
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:268
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:278
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:269
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:258
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:265
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:743

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by PathGenerator::BuildPolyPath(), and Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/5]

SpellCastResult Unit::CastCustomSpell ( SpellInfo const *  spellInfo,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1290{
1291 SpellCastTargets targets;
1292 targets.SetUnitTarget(victim);
1293
1294 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1295}
Definition Spell.h:119
void SetUnitTarget(Unit *target)
Definition Spell.cpp:238

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastCustomSpell() [2/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 return CastCustomSpell(spellInfo, value, victim, triggerFlags, castItem, triggeredByAura, originalCaster);
1287}
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1067
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1251

References CastCustomSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [3/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1264{
1265 CustomSpellValues values;
1266 values.AddSpellMod(mod, value);
1267 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1268}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [4/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1271{
1272 CustomSpellValues values;
1273 values.AddSpellMod(mod, value);
1274 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [5/5]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1252{
1253 CustomSpellValues values;
1254 if (bp0)
1255 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1256 if (bp1)
1257 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1258 if (bp2)
1259 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1260 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1261}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_soul_deflection::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), npc_wild_wyrm::PassengerBoarded(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), boss_krik_thir::boss_krik_thirAI::SummonWatcher(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_living_constellation::UpdateAI(), boss_freya::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), boss_freya_elder_ironbranch::UpdateAI(), npc_ulduar_hodir_priest::UpdateAI(), boss_ignis::UpdateAI(), npc_ulduar_vx001::UpdateAI(), boss_thorim::UpdateAI(), boss_xt002::UpdateAI(), boss_yoggsaron_sara::UpdateAI(), boss_yoggsaron::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20293{
20294 AuraEffect* aurEff = nullptr;
20295 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20296 {
20297 aurEff = *i;
20298 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20299 continue;
20300
20301 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20302 break;
20303 }
20304
20305 // xinef: delay only for casting on different unit
20306 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20307 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20308 else
20309 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20310}
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition WorldConfig.h:144
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:115
uint32 GetId() const
Definition SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7384
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20259
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true, uint8 eventGroup=0)
Definition EventProcessor.cpp:136

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17575{
17576 uint32 auraId = aura->GetAura(GetEntry());
17577 if (!auraId)
17578 return;
17579
17580 if (auraId == 35696) // Demonic Knowledge
17581 {
17582 int32 basePoints = aura->GetDamage();
17583 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17584 }
17585 else
17586 CastSpell(this, auraId, true);
17587}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1298{
1299 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1300 if (!spellInfo)
1301 {
1302 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1304 }
1305
1306 SpellCastTargets targets;
1307 targets.SetDst(x, y, z, GetOrientation());
1308
1309 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1310}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:405

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1313{
1314 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1315 if (!spellInfo)
1316 {
1317 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1319 }
1320
1321 SpellCastTargets targets;
1322 targets.SetGOTarget(go);
1323
1324 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1325}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:270

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1195{
1196 if (!spellInfo)
1197 {
1198 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1200 }
1201
1203 if (!originalCaster && triggeredByAura)
1204 {
1205 originalCaster = triggeredByAura->GetCasterGUID();
1206 }
1207
1208 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1209
1210 if (value)
1211 {
1212 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1213 {
1214 spell->SetSpellValue(itr->first, itr->second);
1215 }
1216 }
1217
1218 spell->m_CastItem = castItem;
1219 return spell->prepare(&targets, triggeredByAura);
1220}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8426
Item * m_CastItem
Definition Spell.h:532

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_the_cleansing_cleansing_soul::AfterRemove(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), Player::ApplyItemObtainSpells(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacle(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orb(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacle(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::DamageTaken(), npc_collapsing_star::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::DamageTaken(), boss_yoggsaron_brain::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::DoAction(), boss_flame_leviathan::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_molten_golem::DoAction(), boss_steelbreaker::DoAction(), npc_ulduar_bot_summon_trigger::DoAction(), boss_thorim_sif::DoAction(), boss_xt002::DoAction(), npc_xt002_heart::DoAction(), boss_yoggsaron_sara::DoAction(), boss_yoggsaron_cloud::DoAction(), boss_yoggsaron::DoAction(), boss_yoggsaron_brain::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_mirkblood_dash_gash_return_to_tank_pre_spell::HandleCast(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_player_mount_wyrm::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_fatal_strike::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_bloodspore_haze::HandleEffectHit(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_taunt_brann::HandleScript(), spell_vehicle_grab_pyrite::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_cleansing_shrine_cast::HandleScript(), spell_the_cleansing_mirror_image_script_effect::HandleScript(), spell_low_health_trigger::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_azjol_drain_power::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_gluth_decimate::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_dragonblight_devour_ghoul::HandleScriptEffect(), spell_hawk_hunting::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::JustDied(), boss_runemaster_molgeim::JustDied(), boss_stormcaller_brundir::JustDied(), boss_freya_summons::JustDied(), npc_ulduar_saronite_vapors::JustDied(), boss_yoggsaron_guardian_of_ys::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), npc_necrotic_shard::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_sartharion::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), npc_nexus_lord::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::JustEngagedWith(), boss_freya_summons::JustEngagedWith(), boss_vezax::JustEngagedWith(), boss_hodir::JustEngagedWith(), boss_thorim::JustEngagedWith(), boss_thorim_ancient_rune_giant::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), npc_ulduar_iron_construct::JustReachedHome(), boss_freya::JustSummoned(), boss_yoggsaron_brain::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::JustSummoned(), boss_algalon_the_observer::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::MovementInform(), boss_razorscale::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_alexstrasza::npc_alexstrasza(), npc_algalon_worm_hole::npc_algalon_worm_hole(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_star(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_nexus_lord::npc_nexus_lord(), npc_power_spark::npc_power_spark(), npc_scion_of_eternity::npc_scion_of_eternity(), npc_ulduar_iron_construct::npc_ulduar_iron_construct(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fire(), npc_xt002_life_spark::npc_xt002_life_spark(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_ancient_skull_pile::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_tar_blaze_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_eye_of_eternity::OnPlayerEnter(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_q12937_relief_for_the_fallen::OnRemove(), spell_claw_swipe_check::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_flame_leviathan_overload_device::OnSpellClick(), boss_yoggsaron_descend_portal::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::PassengerBoarded(), npc_frosthound::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetles::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_algalon_the_observer::Reset(), boss_flame_leviathan::Reset(), npc_thorims_hammer::Reset(), boss_freya_lifebinder::Reset(), boss_freya_healthy_spore::Reset(), boss_freya_nature_bomb::Reset(), boss_thorim_lightning_orb::Reset(), boss_thorim_sif_blizzard::Reset(), boss_thorim_arena_npcs::Reset(), boss_yoggsaron_cloud::Reset(), boss_yoggsaron_immortal_guardian::Reset(), boss_yoggsaron_voice::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), boss_sartharion::SendLavaWaves(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::SpellHit(), npc_ulduar_flames_spread::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), npc_pool_of_tar::SpellHit(), boss_thorim_pillar::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::SpellHit(), boss_ignis::SpellHit(), boss_razorscale::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), npc_overlord_drakuru_betrayal::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_heigan::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_cthun::SummonedCreatureDies(), boss_anubrekhan::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_sartharion::SummonLavaWaves(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), Trainer::Trainer::TeachSpell(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_item_brewfest_hops::Update(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::UpdateAI(), npc_power_spark::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_algalon_worm_hole::UpdateAI(), boss_steelbreaker::UpdateAI(), boss_runemaster_molgeim::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_auriaya_sanctum_sentry::UpdateAI(), boss_flame_leviathan::UpdateAI(), npc_freya_ward::UpdateAI(), boss_freya::UpdateAI(), boss_freya_elder_stonebark::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), boss_freya_elder_ironbranch::UpdateAI(), boss_freya_lifebinder::UpdateAI(), boss_freya_summons::UpdateAI(), boss_freya_nature_bomb::UpdateAI(), boss_vezax::UpdateAI(), npc_ulduar_saronite_animus::UpdateAI(), boss_hodir::UpdateAI(), npc_ulduar_icicle::UpdateAI(), npc_ulduar_hodir_priest::UpdateAI(), npc_ulduar_hodir_druid::UpdateAI(), npc_ulduar_hodir_shaman::UpdateAI(), npc_ulduar_hodir_mage::UpdateAI(), npc_ulduar_iron_construct::UpdateAI(), boss_ignis::UpdateAI(), boss_kologarn::UpdateAI(), boss_kologarn_eyebeam::UpdateAI(), boss_mimiron::UpdateAI(), npc_ulduar_leviathan_mkii::UpdateAI(), npc_ulduar_vx001::UpdateAI(), npc_ulduar_aerial_command_unit::UpdateAI(), npc_ulduar_proximity_mine::UpdateAI(), npc_ulduar_emergency_fire_bot::UpdateAI(), boss_razorscale::UpdateAI(), npc_ulduar_dark_rune_guardian::UpdateAI(), npc_ulduar_dark_rune_watcher::UpdateAI(), npc_ulduar_dark_rune_sentinel::UpdateAI(), boss_thorim::UpdateAI(), boss_thorim_sif::UpdateAI(), boss_thorim_trap::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), boss_thorim_runic_colossus::UpdateAI(), boss_thorim_ancient_rune_giant::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), boss_xt002::UpdateAI(), npc_xt002_pummeller::UpdateAI(), boss_yoggsaron_sara::UpdateAI(), boss_yoggsaron_guardian_of_ys::UpdateAI(), boss_yoggsaron::UpdateAI(), boss_yoggsaron_death_orb::UpdateAI(), boss_yoggsaron_immortal_guardian::UpdateAI(), npc_ulduar_storm_tempered_keeper::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::UpdateAI(), boss_yoggsaron_crusher_tentacle::UpdateAI(), boss_yoggsaron_corruptor_tentacle::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1240{
1241 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1242}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1245{
1246 SpellCastTargets targets;
1247 targets.SetUnitTarget(victim);
1248 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1249}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1223{
1224 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1230 if (!spellInfo)
1231 {
1232 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1234 }
1235
1236 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1237}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19706{
19707 if (!m_vehicle)
19708 return;
19709
19710 if (seatId < 0)
19711 {
19712 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19713 if (seatId < 0)
19714 return;
19715 }
19716 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19717 return;
19718
19720 if (!m_vehicle->AddPassenger(this, seatId))
19721 ABORT();
19722}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:247
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:221

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CheckAttackFitToAuraRequirement()

virtual bool Unit::CheckAttackFitToAuraRequirement ( WeaponAttackType  ,
AuraEffect const *   
) const
inlinevirtual

Reimplemented in Player.

1072{ return true; }

Referenced by UpdateDamageDoneMods(), UpdateDamagePctDoneMods(), and Player::UpdateWeaponDependentCritAuras().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15973{
15975 return;
15976
15977 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15979
15980 if (IsInWorld()) // not in world and not being removed atm
15982
15983 ASSERT(GetGUID());
15984
15985 // A unit may be in removelist and not in world, but it is still in grid
15986 // and may have some references during delete
15989
15990 if (finalCleanup)
15991 m_cleanupDone = true;
15992
15993 CombatStop();
15998 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15999}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:192
void ClearAllThreat()
Definition ThreatMgr.cpp:485
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10646
void RemoveAllGameObjects()
Definition Unit.cpp:6497
void ClearComboPoints()
Definition Unit.cpp:17105
void ClearComboPointHolders()
Definition Unit.cpp:17160
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:947
void RemoveFromWorld() override
Definition Unit.cpp:15926
void RemoveAllAuras()
Definition Unit.cpp:5445
ThreatMgr & GetThreatMgr()
Definition Unit.h:943

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

16002{
16003 if (GetTransport())
16004 {
16006 SetTransport(nullptr);
16009 }
16010
16011 CleanupBeforeRemoveFromMap(finalCleanup);
16012}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15972
void SetTransport(Transport *t)
Definition Object.h:691
void Reset()
Definition Object.h:298
void RemoveMovementFlag(uint32 flag)
Definition Object.h:344

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17169{
17170 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17171 m_reactiveTimer[i] = 0;
17172
17179}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition SharedDefines.h:1303
@ AURA_STATE_HUNTER_PARRY
Definition SharedDefines.h:1309
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:239
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:834
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10757

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
17161{
17162 while (!m_ComboPointHolders.empty())
17163 {
17164 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
17165 }
17166}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
17106{
17107 if (!m_comboTarget)
17108 {
17109 return;
17110 }
17111
17112 // remove Premed-like effects
17113 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
17115
17116 m_comboPoints = 0;
17119 m_comboTarget = nullptr;
17120}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1842{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:748

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13977{
13978 m_CombatTimer = 0;
13980
13981 // Player's state will be cleared in Player::UpdateContestedPvP
13982 if (Creature* creature = ToCreature())
13983 {
13984 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13985 SetImmuneToPC(true); // set immunity state to the one from db on evade
13986
13989 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13990
13991 creature->SetAssistanceTimer(0);
13992
13993 // Xinef: will be recalculated at follow movement generator initialization
13994 if (!IsPet() && !IsCharmed())
13995 return;
13996 }
13997 else if (Player* player = ToPlayer())
13998 {
13999 player->UpdatePotionCooldown();
14000 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
14001 for (uint8 i = 0; i < MAX_RUNES; ++i)
14002 player->SetGracePeriod(i, 0);
14003 }
14004
14005 if (Player* player = this->ToPlayer())
14006 {
14007 sScriptMgr->OnPlayerLeaveCombat(player);
14008 }
14009}
#define MAX_RUNES
Definition Player.h:386
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:238
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:273
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:262
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:759
bool IsCharmed() const
Definition Unit.h:1295
bool IsPet() const
Definition Unit.h:787
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13768
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:739

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
727{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_loken::OnAuraRemove(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), boss_loken::ScheduleTasks(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharm(), Player::SetClientControl(), SmartAI::SetCombatMovement(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13787{
13788 // Xinef: Dont allow to start combat with triggers
13789 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13790 return;
13791
13792 if (initialAggro)
13793 {
13794 // Make player victim stand up automatically
13795 if (victim->getStandState() && victim->IsPlayer())
13796 {
13797 victim->SetStandState(UNIT_STAND_STATE_STAND);
13798 }
13799
13800 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13801 {
13802 if (victim->IsPet())
13803 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13804 else
13805 {
13806 victim->ToCreature()->AI()->AttackStart(this);
13807 // if the target is an NPC with a pet or minion, pet should react.
13808 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13809 {
13810 victimControlledUnit->SetInCombatWith(this);
13811 SetInCombatWith(victimControlledUnit);
13812 victimControlledUnit->AddThreat(this, 0.0f);
13813 }
13814 }
13815
13816 // if unit has an owner, put owner in combat.
13817 if (Unit* victimOwner = victim->GetOwner())
13818 {
13819 if (!(victimOwner->IsInCombatWith(this)))
13820 {
13821 /* warding off to not take over aggro for no reason
13822 Using only AddThreat causes delay in attack */
13823 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13824 {
13825 victimOwner->ToCreature()->AI()->AttackStart(this);
13826 }
13827 victimOwner->SetInCombatWith(this);
13828 SetInCombatWith(victimOwner);
13829 victimOwner->AddThreat(this, 0.0f);
13830 }
13831 }
13832 }
13833
13834 bool alreadyInCombat = IsInCombat();
13835
13836 SetInCombatWith(victim);
13837 victim->SetInCombatWith(this);
13838
13839 // Update leash timer when attacking creatures
13840 if (victim->IsCreature() && this != victim)
13841 victim->ToCreature()->UpdateLeashExtensionTime();
13842
13843 // Xinef: If pet started combat - put owner in combat
13844 if (!alreadyInCombat && IsInCombat())
13845 {
13846 if (Unit* owner = GetOwner())
13847 {
13848 owner->SetInCombatWith(victim);
13849 victim->SetInCombatWith(owner);
13850 }
13851 }
13852 }
13853
13854 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13855 if (who->IsPlayer())
13856 SetContestedPvP(who->ToPlayer());
13857
13859 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13860 {
13861 player->UpdatePvP(true);
13863 }
13864}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:555
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1532
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1272
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17501
Unit * GetFirstControlled() const
Definition Unit.cpp:11291

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13867{
13868 // Xinef: Dont allow to start combat with triggers
13869 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13870 return;
13871
13872 if (initialAggro)
13873 {
13874 SetInCombatWith(target, duration);
13875
13876 // Xinef: If pet started combat - put owner in combat
13877 if (Unit* owner = GetOwner())
13878 owner->SetInCombatWith(target, duration);
13879
13880 // Update leash timer when attacking creatures
13881 if (target->IsCreature())
13883 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13885 }
13886
13887 Unit* who = target->GetCharmerOrOwnerOrSelf();
13888 if (who->IsPlayer())
13889 SetContestedPvP(who->ToPlayer());
13890
13892 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13893 {
13894 player->UpdatePvP(true);
13896 }
13897}
bool IsTrigger() const
Definition Creature.h:80

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10647{
10648 if (includingCast && IsNonMeleeSpellCast(false))
10650
10651 AttackStop();
10653 if (IsPlayer())
10654 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10655 if (Creature* pCreature = ToCreature())
10656 pCreature->ClearLastLeashExtensionTimePtr();
10657 ClearInCombat();
10658
10659 // xinef: just in case
10660 if (IsPetInCombat() && !IsPlayer())
10662}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:141
bool IsPetInCombat() const
Definition Unit.h:927
void ClearInPetCombat()
Definition Unit.cpp:14011
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10694
void ClearInCombat()
Definition Unit.cpp:13976
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10613

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_crystalline_frayer::EnterSeedPod(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10665{
10666 CombatStop(includingCast);
10667
10668 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10669 (*itr)->CombatStop(includingCast);
10670}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1107{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1093

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1106{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition Unit.h:1094

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::KilledUnit(), Pet::LoadPetFromDB(), spell_gluth_decimate_damage::PrepareSpellScript(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17605{
17606 if (!IsPlayer())
17607 return nullptr;
17608
17609 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17610
17611 if (!pet->CreateBaseAtCreature(creatureTarget))
17612 {
17613 delete pet;
17614 return nullptr;
17615 }
17616
17617 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17618
17619 if (!InitTamedPet(pet, level, spell_id))
17620 {
17621 delete pet;
17622 return nullptr;
17623 }
17624
17625 return pet;
17626}
@ HUNTER_PET
Definition PetDefines.h:33
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17648

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17629{
17630 if (!IsPlayer())
17631 return nullptr;
17632
17633 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17634 if (!creatureInfo)
17635 return nullptr;
17636
17637 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17638
17639 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17640 {
17641 delete pet;
17642 return nullptr;
17643 }
17644
17645 return pet;
17646}
#define sObjectMgr
Definition ObjectMgr.h:1699
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18974{
18975 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18976 if (!vehInfo)
18977 return false;
18978
18979 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18982 return true;
18983}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

825{
826 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
827 // Xinef: initialize damage done for rage calculations
828 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
829 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
830
831 //if (attacker)
832 {
833 if (victim->IsAIEnabled)
834 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
835
836 if (attacker && attacker->IsAIEnabled)
837 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
838 }
839
840 // Hook for OnDamage Event
841 sScriptMgr->OnDamage(attacker, victim, damage);
842
843 if (victim->IsPlayer() && attacker != victim)
844 {
845 // Signal to pets that their owner was attacked
846 Pet* pet = victim->ToPlayer()->GetPet();
847
848 if (pet && pet->IsAlive())
849 pet->AI()->OwnerAttackedBy(attacker);
850 }
851
852 //Dont deal damage to unit if .cheat god is enable.
853 if (victim->IsPlayer())
854 {
855 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
856 {
857 return 0;
858 }
859 }
860
861 // Signal the pet it was attacked so the AI can respond if needed
862 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
863 victim->ToPet()->AI()->AttackedBy(attacker);
864
865 if (damagetype != NODAMAGE)
866 {
867 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
868 if (spellProto)
869 {
870 if (attacker && damagetype != DOT && spellProto->DmgClass == SPELL_DAMAGE_CLASS_MELEE && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_HOLY))
871 attacker->DealDamageShieldDamage(victim);
872
873 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
875 }
876 else
878
879 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
880 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
881 {
882 if (victim != attacker && victim->IsPlayer())
883 {
884 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
885 {
886 if (spell->getState() == SPELL_STATE_PREPARING)
887 {
888 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
889 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
890 {
891 victim->InterruptNonMeleeSpells(false);
892 }
893 }
894 }
895 }
896 }
897
898 // We're going to call functions which can modify content of the list during iteration over it's elements
899 // Let's copy the list so we can prevent iterator invalidation
901 // copy damage to casters of this aura
902 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
903 {
904 // Check if aura was removed during iteration - we don't need to work on such auras
905 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
906 continue;
907 // check damage school mask
908 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
909 continue;
910
911 Unit* shareDamageTarget = (*i)->GetCaster();
912 if (!shareDamageTarget)
913 continue;
914 SpellInfo const* spell = (*i)->GetSpellInfo();
915
916 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
917
918 uint32 shareAbsorb = 0;
919 uint32 shareResist = 0;
920
921 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
922 {
923 shareAbsorb = shareDamage;
924 shareDamage = 0;
925 }
926 else
927 {
928 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
929 Unit::CalcAbsorbResist(sharedDamageInfo, true);
930 shareAbsorb = sharedDamageInfo.GetAbsorb();
931 shareResist = sharedDamageInfo.GetResist();
932 shareDamage = sharedDamageInfo.GetDamage();
933 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
934 }
935
936 if (attacker && shareDamageTarget->IsPlayer())
937 {
938 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
939 }
940
941 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
942 }
943 }
944
945 // Rage from Damage made (only from direct weapon damage)
946 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
947 {
948 uint32 weaponSpeedHitFactor;
949
950 switch (cleanDamage->attackType)
951 {
952 case BASE_ATTACK:
953 case OFF_ATTACK:
954 {
955 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
956 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
957 weaponSpeedHitFactor *= 2;
958
959 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
960 break;
961 }
962 case RANGED_ATTACK:
963 break;
964 default:
965 break;
966 }
967 }
968
969 if (!damage)
970 {
971 // Rage from absorbed damage
972 if (cleanDamage && cleanDamage->absorbed_damage)
973 {
974 if (victim->HasActivePowerType(POWER_RAGE))
975 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
976
977 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
978 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
979 }
980
981 return 0;
982 }
983
984 LOG_DEBUG("entities.unit", "DealDamageStart");
985
986 uint32 health = victim->GetHealth();
987 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
988
989 // duel ends when player has 1 or less hp
990 bool duel_hasEnded = false;
991 bool duel_wasMounted = false;
992 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
993 {
994 // xinef: situation not possible earlier, just return silently.
995 if (!attacker)
996 return 0;
997
998 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
999 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
1000 damage = health - 1;
1001
1002 duel_hasEnded = true;
1003 }
1004 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1005 {
1006 Player* victimRider = victim->GetCharmer()->ToPlayer();
1007
1008 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1009 {
1010 // xinef: situation not possible earlier, just return silently.
1011 if (!attacker)
1012 return 0;
1013
1014 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1015 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1016 damage = health - 1;
1017
1018 duel_wasMounted = true;
1019 duel_hasEnded = true;
1020 }
1021 }
1022
1023 if (attacker && attacker != victim)
1024 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1025 {
1026 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1027 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1028 // return 0;
1029
1030 if (Battleground* bg = killer->GetBattleground())
1031 {
1032 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1033 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1034 }
1035 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1036 }
1037
1038 if (victim->IsPlayer())
1039 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1040 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1041 {
1042 if (!victim->ToCreature()->hasLootRecipient())
1043 victim->ToCreature()->SetLootRecipient(attacker);
1044
1045 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1046 {
1047 uint32 unDamage = health < damage ? health : damage;
1048 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1049 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1050 }
1051 }
1052
1053 // Sparring
1054 if (victim->CanSparringWith(attacker))
1055 {
1056 if (damage >= victim->GetHealth())
1057 damage = 0;
1058
1059 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1060 if (victim->GetHealth() - damage <= sparringHealth)
1061 damage = 0;
1062 }
1063
1064 if (health <= damage)
1065 {
1066 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1067
1068 //if (attacker && victim->IsPlayer() && victim != attacker)
1069 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1070 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1071 }
1072 else
1073 {
1074 LOG_DEBUG("entities.unit", "DealDamageAlive");
1075
1076 //if (victim->IsPlayer())
1077 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1078
1079 victim->ModifyHealth(- (int32)damage);
1080
1081 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1082 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1083
1084 if (!victim->IsPlayer())
1085 {
1087 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1089
1090 if (attacker && attacker != victim)
1091 {
1092 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1093 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1094
1095 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1096 }
1097 }
1098 else // victim is a player
1099 {
1100 // random durability for items (HIT TAKEN)
1102 {
1105 }
1106 }
1107
1108 // Rage from damage received
1109 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1110 {
1111 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1112 victim->RewardRage(rageDamage, 0, false);
1113 }
1114
1115 if (attacker && attacker->IsPlayer())
1116 {
1117 // random durability for items (HIT DONE)
1119 {
1121 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1122 }
1123 }
1124
1125 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1126 {
1127 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1128 {
1129 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1130 {
1131 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1132 {
1133 if (spell->getState() == SPELL_STATE_PREPARING)
1134 {
1135 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1136 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1137 {
1138 victim->InterruptNonMeleeSpells(false);
1139 }
1140 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1141 {
1142 spell->Delayed();
1143 }
1144 }
1145 }
1146
1147 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1148 if (spell->getState() == SPELL_STATE_CASTING)
1149 {
1150 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1151 {
1152 spell->DelayedChannel();
1153 }
1154 }
1155 }
1156 }
1157 }
1158
1159 // last damage from duel opponent
1160 if (duel_hasEnded)
1161 {
1162 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1163
1164 ASSERT_NODEBUGINFO(he && he->duel);
1165
1166 if (duel_wasMounted) // In this case victim==mount
1167 victim->SetHealth(1);
1168 else
1169 he->SetHealth(1);
1170
1171 he->duel->Opponent->CombatStopWithPets(true);
1172 he->CombatStopWithPets(true);
1173
1174 he->CastSpell(he, 7267, true); // beg
1176 }
1177 }
1178
1179 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1180
1181 return damage;
1182}
@ SCORE_DAMAGE_DONE
Definition BattlegroundScore.h:32
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition Errors.h:69
@ CHEAT_GOD
Definition Player.h:996
EquipmentSlots
Definition Player.h:660
@ EQUIPMENT_SLOT_END
Definition Player.h:681
bool roll_chance_f(float chance)
Definition Random.h:57
@ POWER_RAGE
Definition SharedDefines.h:281
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition SharedDefines.h:658
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition SharedDefines.h:529
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition SharedDefines.h:521
@ DUEL_WON
Definition SharedDefines.h:3869
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition SharedDefines.h:555
@ SPELL_AURA_DAMAGE_SHIELD
Definition SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition Spell.h:235
@ SPELL_STATE_CASTING
Definition Spell.h:236
@ NODAMAGE
Definition Unit.h:259
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:546
@ CURRENT_GENERIC_SPELL
Definition Unit.h:545
@ RATE_DURABILITY_LOSS_DAMAGE
Definition WorldConfig.h:482
virtual void OwnerAttackedBy(Unit *)
Definition CreatureAI.h:177
virtual void AttackedBy(Unit *)
Definition CreatureAI.h:154
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1281
bool hasLootRecipient() const
Definition Creature.h:233
float GetSparringPct() const
Definition Creature.h:190
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition Creature.cpp:3680
bool IsPlayer() const
Definition ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2166
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4730
Pet * GetPet() const
Definition Player.cpp:8947
bool GetCommandStatus(uint32 command) const
Definition Player.h:1198
uint32 ChannelInterruptFlags
Definition SpellInfo.h:354
uint32 InterruptFlags
Definition SpellInfo.h:352
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition UnitAI.h:368
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14273
Pet * ToPet()
Definition Unit.h:719
bool IsCreatedByPlayer() const
Definition Unit.h:1293
Unit * GetCharmer() const
Definition Unit.cpp:10818
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition Unit.cpp:17969
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition Unit.cpp:20122
void SetHealth(uint32 val)
Definition Unit.cpp:15722
ObjectGuid GetCharmerGUID() const
Definition Unit.h:709
void DealDamageShieldDamage(Unit *victim)
Definition Unit.cpp:1982
virtual bool HasActivePowerType(Powers power)
Definition Unit.h:1117
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10664

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DealDamageShieldDamage(), DIRECT_DAMAGE, SpellInfo::DmgClass, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_SCHOOL_MASK_HOLY, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealDamageShieldDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealDamageShieldDamage()

void Unit::DealDamageShieldDamage ( Unit victim)
Todo:
: Move this to a packet handler
1983{
1984 // We're going to call functions which can modify content of the list during iteration over it's elements
1985 // Let's copy the list so we can prevent iterator invalidation
1987 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1988 {
1989 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1990 // Damage shield can be resisted...
1991 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1992 {
1993 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1994 continue;
1995 }
1996
1997 // ...or immuned
1998 if (IsImmunedToDamageOrSchool(i_spellProto))
1999 {
2000 victim->SendSpellDamageImmune(this, i_spellProto->Id);
2001 continue;
2002 }
2003
2004 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
2005
2006 if (Unit* caster = (*dmgShieldItr)->GetCaster())
2007 {
2008 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
2009 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
2010 }
2011
2012 uint32 absorb = 0;
2013
2014 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2015 Unit::CalcAbsorbResist(dmgInfo);
2016 absorb = dmgInfo.GetAbsorb();
2017 damage = dmgInfo.GetDamage();
2018
2019 Unit::DealDamageMods(this, damage, &absorb);
2020
2022 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2023 data << victim->GetGUID();
2024 data << GetGUID();
2025 data << uint32(i_spellProto->Id);
2026 data << uint32(damage); // Damage
2027 int32 overkill = int32(damage) - int32(GetHealth());
2028 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2029 data << uint32(i_spellProto->GetSchoolMask());
2030 victim->SendMessageToSet(&data, true);
2031
2032 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2033 }
2034}
SpellMissInfo
Definition SharedDefines.h:1529
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1878
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6678
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6702
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3504
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:12002
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2083
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621

References CalcAbsorbResist(), DealDamage(), DealDamageMods(), DamageInfo::GetAbsorb(), GetAuraEffectsByType(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetHealth(), SpellInfo::GetSchoolMask(), SpellInfo::Id, IsImmunedToDamageOrSchool(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), and SpellHitResult().

Referenced by DealDamage(), and DealMeleeDamage().

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11168{
11169 int32 gain = 0;
11170
11171 if (healer)
11172 {
11173 if (victim->IsAIEnabled)
11174 victim->GetAI()->HealReceived(healer, addhealth);
11175
11176 if (healer->IsAIEnabled)
11177 healer->GetAI()->HealDone(victim, addhealth);
11178 }
11179
11180 if (addhealth)
11181 gain = victim->ModifyHealth(int32(addhealth));
11182
11183 // Hook for OnHeal Event
11184 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11185
11186 Unit* unit = healer;
11187
11188 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11189 unit = healer->GetOwner();
11190
11191 if (!unit)
11192 return gain;
11193
11194 if (Player* player = unit->ToPlayer())
11195 {
11196 if (Battleground* bg = player->GetBattleground())
11197 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11198
11199 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11200 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11201 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11202
11203 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11204 }
11205
11206 /*if (Player* player = victim->ToPlayer())
11207 {
11208 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11209 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11210 }*/
11211
11212 return gain;
11213}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
1862{
1863 Unit* victim = damageInfo->target;
1864
1865 auto canTakeMeleeDamage = [&]()
1866 {
1867 return victim->IsAlive() && !victim->IsInFlight() && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1868 };
1869
1870 if (!canTakeMeleeDamage())
1871 {
1872 return;
1873 }
1874
1875 // Hmmmm dont like this emotes client must by self do all animations
1876 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1878 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1880
1881 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1882 bool isParryHasteEnabled = !victim->IsCreature() ||
1884 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1885 {
1886 // Get attack timers
1887 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1888 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1889 // Reduce attack time
1890 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1891 {
1892 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1893 float percent60 = 3.0f * percent20;
1894 if (offtime > percent20 && offtime <= percent60)
1895 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1896 else if (offtime > percent60)
1897 {
1898 offtime -= 2.0f * percent20;
1899 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1900 }
1901 }
1902 else
1903 {
1904 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1905 float percent60 = 3.0f * percent20;
1906 if (basetime > percent20 && basetime <= percent60)
1907 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1908 else if (basetime > percent60)
1909 {
1910 basetime -= 2.0f * percent20;
1911 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1912 }
1913 }
1914 }
1915
1916 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1917 {
1918 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1919 {
1920 continue;
1921 }
1922
1923 // Call default DealDamage
1924 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1925 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1926 }
1927
1928 // gain rage if attack is fully blocked, dodged or parried
1930 {
1931 switch (damageInfo->attackType)
1932 {
1933 case BASE_ATTACK:
1934 case OFF_ATTACK:
1935 {
1936 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1937 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1938 break;
1939 }
1940 default:
1941 break;
1942 }
1943 }
1944
1945 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1946 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1947 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1948 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1949 {
1950 // -probability is between 0% and 40%
1951 // 20% base chance
1952 float Probability = 20.0f;
1953
1954 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1955 if (victim->GetLevel() < 30)
1956 Probability = 0.65f * victim->GetLevel() + 0.5f;
1957
1958 uint32 VictimDefense = victim->GetDefenseSkillValue();
1960 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1961
1962 // xinef: fix daze mechanics
1963 Probability -= ((float)VictimDefense + (float)VictimAuraDefense - AttackerMeleeSkill) * 0.1428f;
1964
1965 if (Probability > 40.0f)
1966 Probability = 40.0f;
1967
1968 // Daze application
1969 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1970 if (roll_chance_f(std::max(0.0f, Probability)))
1971 CastSpell(victim, 1604, true);
1972 }
1973
1974 if (IsPlayer())
1975 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1976
1977 // Do effect if any damage done to target
1978 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1979 DealDamageShieldDamage(victim);
1980}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1935
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1941
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition SpellAuraDefines.h:250
@ CONFIG_ENABLE_DAZE
Definition WorldConfig.h:145
bool isWorldBoss() const
Definition Creature.h:124
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7230
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1175
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3650
bool IsInFlight() const
Definition Unit.h:1685
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2036
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:279
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:148

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageShieldDamage(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, GetAttackTime(), getAttackTimer(), Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), GetTotalAuraModifier(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), setAttackTimer(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1471{
1472 if (damageInfo == 0)
1473 return;
1474
1475 Unit* victim = damageInfo->target;
1476
1477 if (!victim)
1478 return;
1479
1480 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1481 return;
1482
1483 SpellInfo const* spellProto = damageInfo->spellInfo;
1484 if (!spellProto)
1485 {
1486 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1487 return;
1488 }
1489
1490 // Call default DealDamage
1491 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1492 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1493}
SpellInfo const * spellInfo
Definition Unit.h:504

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5589{
5590 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5591 for (; range.first != range.second; ++range.first)
5592 {
5593 Aura* aura = range.first->second;
5594 if (!caster || aura->GetCasterGUID() == caster)
5595 {
5596 if (aura->GetDuration() < delaytime)
5597 aura->SetDuration(0);
5598 else
5599 aura->SetDuration(aura->GetDuration() - delaytime);
5600
5601 // update for out of range group members (on 1 slot use)
5603 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5604 }
5605 }
5606}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1210
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:810
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:662

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
16050{
16051 if (!m_charmInfo)
16052 return;
16053
16055 delete m_charmInfo;
16056 m_charmInfo = nullptr;
16057}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4406{
4408}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:17003
uint32 GetNativeDisplayId() const
Definition Unit.h:1955

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18532{
18533 if (!IsCreature())
18534 return;
18535
18536 if (apply)
18540}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:738

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::EnableSara(), boss_anub_arak::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::EnterEvadeMode(), boss_razorscale::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_razorscale::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::Reset(), boss_kologarn::Reset(), boss_ingvar_the_plunderer::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::UpdateAI(), boss_razorscale::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13684{
13685 if (!IsMounted())
13686 return;
13687
13690
13691 if (Player* player = ToPlayer())
13692 {
13693 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13694 data << GetPackGUID();
13695 data << player->GetSession()->GetOrderCounter(); // movement counter
13696 data << player->GetCollisionHeight();
13697 player->SendDirectMessage(&data);
13698 player->GetSession()->IncrementOrderCounter();
13699 }
13700
13701 WorldPacket data(SMSG_DISMOUNT, 8);
13702 data << GetPackGUID();
13703 SendMessageToSet(&data, true);
13704
13705 // dismount as a vehicle
13706 if (IsPlayer() && GetVehicleKit())
13707 {
13708 // Send other players that we are no longer a vehicle
13709 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13710 data << GetPackGUID();
13711 data << uint32(0);
13712 ToPlayer()->SendMessageToSet(&data, true);
13713 // Remove vehicle from player
13715 }
13716
13718
13719 // only resummon old pet if the player is already added to a map
13720 // this prevents adding a pet to a not created map which would otherwise cause a crash
13721 // (it could probably happen when logging in after a previous crash)
13722 if (Player* player = ToPlayer())
13723 {
13724 sScriptMgr->AnticheatSetUnderACKmount(player);
13725
13726 if (Pet* pPet = player->GetPet())
13727 {
13728 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13729 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13730 }
13731 else
13732 player->ResummonPetTemporaryUnSummonedIfAny();
13733
13734 // xinef: if we have charmed npc, remove stun also
13735 if (Unit* charm = player->GetCharm())
13736 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13737 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13738 }
13739}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:272
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:281
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5662
void RemoveVehicleKit()
Definition Unit.cpp:18985
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11485{
11486 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11487
11488 if (powerType != POWER_HAPPINESS && gainedPower)
11489 {
11490 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11491 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11492 }
11493
11494 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11495}
@ POWER_HAPPINESS
Definition SharedDefines.h:284
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition Unit.cpp:11473

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19629{
19631
19632 if (Player* player = ToPlayer())
19633 {
19634 sScriptMgr->AnticheatSetUnderACKmount(player);
19635 }
19636}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), boss_malygos::UpdateAI(), and boss_mimiron::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20491{
20493 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20494 return;
20495
20496 Acore::AIRelocationNotifier notifier(*this);
20497 float radius = 60.0f;
20498 Cell::VisitObjects(this, notifier, radius);
20499}
@ NOTIFY_AI_RELOCATION
Definition Object.h:69
void RemoveFromNotify(uint16 f)
Definition Object.h:659
Definition GridNotifiers.h:91
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20390{
20392 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20393 return;
20394
20395 if (this->HasSharedVision())
20396 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20397 if (Player* player = (*itr))
20398 {
20399 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20400 continue;
20401 WorldObject* viewPoint = player;
20402 if (player->m_seer && player->m_seer->IsInWorld())
20403 viewPoint = player->m_seer;
20404 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20405 continue;
20406
20407 if (Unit* active = viewPoint->ToUnit())
20408 {
20409 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20410 // active = player;
20411
20412 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20413 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20414 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20415 float distsq = dx * dx + dy * dy + dz * dz;
20416 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20417 if (distsq < mindistsq)
20418 continue;
20419
20420 // this will be relocated below sharedvision!
20421 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20422 }
20423
20424 Acore::PlayerRelocationNotifier notifier(*player);
20425 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20427 notifier.SendToSelf();
20428 }
20429
20430 if (Player* player = this->ToPlayer())
20431 {
20432 WorldObject* viewPoint = player;
20433 if (player->m_seer && player->m_seer->IsInWorld())
20434 viewPoint = player->m_seer;
20435
20436 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20437 return;
20438
20439 if (Unit* active = viewPoint->ToUnit())
20440 {
20441 if (active->IsVehicle())
20442 active = player;
20443
20444 if (!player->GetFarSightDistance())
20445 {
20446 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20447 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20448 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20449 float distsq = dx * dx + dy * dy + dz * dz;
20450
20451 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20452 if (distsq < mindistsq)
20453 return;
20454
20455 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20456 }
20457 }
20458
20460
20461 Acore::PlayerRelocationNotifier notifier(*player);
20462 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20464 notifier.SendToSelf();
20465
20467 }
20468 else if (Creature* unit = this->ToCreature())
20469 {
20470 if (!unit->IsPositionValid())
20471 return;
20472
20473 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20474 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20475 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20476 float distsq = dx * dx + dy * dy + dz * dz;
20477 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20478 if (distsq < mindistsq)
20479 return;
20480
20481 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20482
20483 Acore::CreatureRelocationNotifier relocate(*unit);
20484 Cell::VisitObjects(unit, relocate, unit->GetVisibilityRange());
20485
20487 }
20488}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
#define VISIBILITY_DISTANCE_GIGANTIC
Definition ObjectDefines.h:34
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:70
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:226
Unit * ToUnit()
Definition Object.h:209
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1856
bool HasSharedVision() const
Definition Unit.h:1859
uint32 GetMapId() const
Definition Position.h:281
Definition Object.h:471
void AddToNotify(uint16 f)
Definition Object.cpp:2990
Definition GridNotifiers.h:83
Definition GridNotifiers.h:74
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185
bool IsPositionValid() const
Definition Position.cpp:183

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19725{
19727 if (!m_vehicle)
19728 return;
19729
19731 if (Player* player = ToPlayer())
19732 {
19733 player->SetCanTeleport(true);
19734 }
19738 /*_ExitVehicle(exitPosition);*/
19745
19746 if (Player* player = ToPlayer())
19747 {
19748 sScriptMgr->AnticheatSetUnderACKmount(player);
19749 }
19750}
Unit * GetVehicleBase() const
Definition Unit.cpp:19000

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::EnterEvadeMode(), npc_ulduar_leviathan_mkii::EnterEvadeMode(), npc_ulduar_vx001::EnterEvadeMode(), npc_ulduar_aerial_command_unit::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::JustDied(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4135{
4136 Spell* spell = m_currentSpells[spellType];
4137 if (!spell)
4138 return;
4139
4140 if (spellType == CURRENT_CHANNELED_SPELL)
4141 spell->SendChannelUpdate(0);
4142
4143 spell->finish(ok);
4144}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5140

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10836{
10837 if (!GetCharmerOrOwnerGUID())
10838 return const_cast<Unit*>(this)->ToPlayer();
10839
10840 if (Unit* owner = GetCharmerOrOwner())
10842
10843 return nullptr;
10844}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1280

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
683{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_fatal_strike::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_grip::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), spell_black_knight_ghoul_claw::HandleSpellHit(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_claw_swipe_check::OnApply(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), spell_grip::OnRemove(), spell_claw_swipe_check::OnRemove(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
11062{
11063 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
11064 {
11065 Unit* unit = *itr;
11066 ++itr;
11067 if (unit->GetEntry() == entry && unit->IsCreature()
11068 && unit->ToCreature()->IsSummon()) // minion, actually
11069 Minions.push_back(unit->ToCreature());
11070 }
11071}
bool IsSummon() const
Definition Unit.h:784

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17472{
17473 if (!normalized || !IsPlayer())
17474 return float(GetAttackTime(attType)) / 1000.0f;
17475
17476 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17477 if (!Weapon)
17478 return 2.4f; // fist attack
17479
17480 switch (Weapon->GetTemplate()->InventoryType)
17481 {
17482 case INVTYPE_2HWEAPON:
17483 return 3.3f;
17484 case INVTYPE_RANGED:
17486 case INVTYPE_THROWN:
17487 return 2.8f;
17488 case INVTYPE_WEAPON:
17491 default:
17492 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17493 }
17494}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:67
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:490
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1369{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
755{
756 if (GetVictim() != nullptr)
757 return GetVictim();
758
759 if (!IsEngaged())
760 return nullptr;
761
762 if (!m_attackers.empty())
763 return *(m_attackers.begin());
764
765 return nullptr;
766}
bool IsEngaged() const
Definition Unit.h:921

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5708{
5709 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5710 return aurApp ? aurApp->GetBase() : nullptr;
5711}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5688

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::SpellHitTarget(), boss_yoggsaron_sara::SpellHitTarget(), npc_twilight_summon::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), npc_ulduar_iron_construct::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5689{
5690 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5691 for (; range.first != range.second; ++range.first)
5692 {
5693 AuraApplication* app = range.first->second;
5694 Aura const* aura = app->GetBase();
5695
5696 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5697 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5698 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5699 && (!except || except != app))
5700 {
5701 return app;
5702 }
5703 }
5704 return nullptr;
5705}
uint8 GetEffectMask() const
Definition SpellAuras.h:177
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:665

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5714{
5715 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5716 while (rankSpell)
5717 {
5718 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5719 return aurApp;
5720 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5721 }
5722 return nullptr;
5723}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5809{
5810 uint32 count = 0;
5811 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5812
5813 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5814 {
5815 if (itr->second->GetBase()->GetStackAmount() == 0)
5816 ++count;
5817 else
5818 count += (uint32)itr->second->GetBase()->GetStackAmount();
5819 }
5820
5821 return count;
5822}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5661{
5662 AuraEffectList const& auras = GetAuraEffectsByType(type);
5663 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5664 {
5665 SpellInfo const* spell = (*i)->GetSpellInfo();
5666 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5667 {
5668 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5669 continue;
5670 return (*i);
5671 }
5672 }
5673 return nullptr;
5674}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:459

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5647{
5648 AuraEffectList const& auras = GetAuraEffectsByType(type);
5649 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5650 {
5651 if (effIndex != (*itr)->GetEffIndex())
5652 continue;
5653 SpellInfo const* spell = (*itr)->GetSpellInfo();
5654 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5655 return *itr;
5656 }
5657 return nullptr;
5658}
uint32 SpellIconID
Definition SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5621{
5622 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5623 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5624 {
5625 if (itr->second->HasEffect(effIndex)
5626 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5627 {
5628 return itr->second->GetBase()->GetEffect(effIndex);
5629 }
5630 }
5631 return nullptr;
5632}

References AuraEffect::GetBase(), Aura::GetEffect(), and m_appliedAuras.

Referenced by CalculateSpellAmount(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5677{
5679 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5680 {
5681 if ((*itr)->GetId() == spellid)
5682 return *itr;
5683 }
5684
5685 return nullptr;
5686}
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5635{
5636 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5637 while (rankSpell)
5638 {
5639 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5640 return aurEff;
5641 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5642 }
5643 return nullptr;
5644}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5620

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1413{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Spell::_cast(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Spell::CanAutoCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealDamageShieldDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetHighestExclusiveSameEffectSpellGroupValue(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsHighestExclusiveAuraEffect(), IsImmunedToSpellEffect(), IsScriptOverriden(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Player::RegenerateAll(), Creature::Respawn(), RestoreDisplayId(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5726{
5727 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5728 return aurApp ? aurApp->GetBase() : nullptr;
5729}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5713

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17332{
17333 // Not apply this to creature casted spells with casttime == 0
17334 if (CastingTime == 0 && IsCreature() && !IsPet())
17335 return 3500;
17336
17337 if (CastingTime > 7000) CastingTime = 7000;
17338 if (CastingTime < 1500) CastingTime = 1500;
17339
17340 if (damagetype == DOT && !spellProto->IsChanneled())
17341 CastingTime = 3500;
17342
17343 int32 overTime = 0;
17344 uint8 effects = 0;
17345 bool DirectDamage = false;
17346 bool AreaEffect = false;
17347
17348 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17349 {
17350 switch (spellProto->Effects[i].Effect)
17351 {
17357 case SPELL_EFFECT_HEAL:
17358 DirectDamage = true;
17359 break;
17361 switch (spellProto->Effects[i].ApplyAuraName)
17362 {
17366 if (spellProto->GetDuration())
17367 overTime = spellProto->GetDuration();
17368 break;
17369 default:
17370 // -5% per additional effect
17371 ++effects;
17372 break;
17373 }
17374 default:
17375 break;
17376 }
17377
17378 if (spellProto->Effects[i].IsTargetingArea())
17379 AreaEffect = true;
17380 }
17381
17382 // Combined Spells with Both Over Time and Direct Damage
17383 if (overTime > 0 && DirectDamage)
17384 {
17385 // mainly for DoTs which are 3500 here otherwise
17386 uint32 OriginalCastTime = spellProto->CalcCastTime();
17387 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17388 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17389 // Portion to Over Time
17390 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17391
17392 if (damagetype == DOT)
17393 CastingTime = uint32(CastingTime * PtOT);
17394 else if (PtOT < 1.0f)
17395 CastingTime = uint32(CastingTime * (1 - PtOT));
17396 else
17397 CastingTime = 0;
17398 }
17399
17400 // Area Effect Spells receive only half of bonus
17401 if (AreaEffect)
17402 CastingTime /= 2;
17403
17404 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17405 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17406 {
17407 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17408 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17409 {
17410 CastingTime /= 2;
17411 break;
17412 }
17413 }
17414
17415 // -5% of total per any additional effect
17416 for (uint8 i = 0; i < effects; ++i)
17417 CastingTime *= 0.95f;
17418
17419 return CastingTime;
17420}
@ SPELL_EFFECT_POWER_BURN
Definition SharedDefines.h:851
@ SPELL_EFFECT_HEALTH_LEECH
Definition SharedDefines.h:798
@ SPELL_EFFECT_HEAL
Definition SharedDefines.h:799
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition SharedDefines.h:796
@ SPELL_EFFECT_POWER_DRAIN
Definition SharedDefines.h:797
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:791
@ SPELL_EFFECT_APPLY_AURA
Definition SharedDefines.h:795
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10882{
10883 if (ObjectGuid charm_guid = GetCharmGUID())
10884 {
10885 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10886 return pet;
10887
10888 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10890 }
10891
10892 return nullptr;
10893}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
ObjectGuid GetCharmGUID() const
Definition Unit.h:711
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:199

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1273 {
1274 if (Unit* u = GetCharmerOrOwner())
1275 return u;
1276
1277 return (Unit*)this;
1278 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10827{
10829 if (guid.IsPlayer())
10830 return ObjectAccessor::GetPlayer(*this, guid);
10831
10832 return const_cast<Unit*>(this)->ToPlayer();
10833}
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), _IsValidAttackTarget(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
833{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::IsSpellFitByClassAndRace(), Trainer::Trainer::IsTrainerValidForPlayer(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetClientControlling()

Player const * Unit::GetClientControlling ( ) const
21478{
21479 // Serverside reverse "mover" deduction logic at controlled unit
21480
21481 // Applies only to player controlled units
21483 {
21484 // Charm always removes control from original client...
21485 if (GetCharmerGUID())
21486 {
21487 // ... but if it is a possessing charm, some other client may have control
21489 {
21490 Unit const* charmer = GetCharmer();
21491 if (charmer && charmer->IsPlayer())
21492 return static_cast<Player const*>(charmer);
21493 }
21494 }
21495 else if (IsPlayer())
21496 {
21497 // Check if anything prevents original client from controlling
21498 if (IsClientControlled(static_cast<Player const*>(this)))
21499 return static_cast<Player const*>(this);
21500 }
21501 }
21502 return nullptr;
21503}
bool IsClientControlled(Player const *exactClient=nullptr) const
Definition Unit.cpp:21450

References GetCharmer(), GetCharmerGUID(), Object::HasFlag(), IsClientControlled(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by SendMoveRoot(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21210{
21211 float scaleMod = GetObjectScale(); // 99% sure about this
21212 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21213
21214 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21215 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21216 float collisionHeight = 0.0f;
21217
21218 if (IsMounted())
21219 {
21221 {
21222 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21223 {
21224 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21225 }
21226 }
21227 }
21228 else
21229 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21230
21231 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21232}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:49
float GetObjectScale() const
Definition Object.h:119
Definition DBCStructure.h:721
uint32 ModelId
Definition DBCStructure.h:723
float scale
Definition DBCStructure.h:726
Definition DBCStructure.h:775
float Scale
Definition DBCStructure.h:779
float CollisionHeight
Definition DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

21204{
21205 return GetCollisionWidth() / 2;
21206}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition Unit.cpp:21166

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

21167{
21168 if (IsPlayer())
21169 return GetObjectSize();
21170
21171 float scaleMod = GetObjectScale(); // 99% sure about this
21172 float objectSize = GetObjectSize();
21173 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21174
21176 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21177 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21178
21179 if (IsMounted())
21180 {
21182 {
21183 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21184 {
21185 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21186 modelData = mountModelData;
21187 }
21188 }
21189 }
21190
21191 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21192 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
21193 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21194}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:44
float GetObjectSize() const
Definition Object.cpp:2808
float CollisionWidth
Definition DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19451{
19452 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19453 return CalculatePct(damage, percent);
19454}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19438

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19439{
19440 if (Player const* player = ToPlayer())
19441 return player->GetRatingBonusValue(cr);
19442 // Player's pet get resilience from owner
19443 else if (IsPet() && GetOwner())
19444 if (Player* owner = GetOwner()->ToPlayer())
19445 return owner->GetRatingBonusValue(cr);
19446
19447 return 0.0f;
19448}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
934{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
1000{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
1001{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10877{
10879}
@ SUMMON_SLOT_MINIPET
Definition SharedDefines.h:3556
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15891{
15892 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15893 switch (power)
15894 {
15895 case POWER_MANA:
15896 return GetCreateMana();
15897 case POWER_RAGE:
15898 return 1000;
15899 case POWER_FOCUS:
15900 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15901 case POWER_ENERGY:
15902 return 100;
15903 case POWER_HAPPINESS:
15904 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15905 case POWER_RUNIC_POWER:
15906 return 1000;
15907 case POWER_RUNE:
15908 return 0;
15909 case POWER_HEALTH:
15910 return 0;
15911 default:
15912 break;
15913 }
15914
15915 return 0;
15916}
@ POWER_HEALTH
Definition SharedDefines.h:289
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_ENERGY
Definition SharedDefines.h:283
@ POWER_RUNE
Definition SharedDefines.h:285
@ POWER_FOCUS
Definition SharedDefines.h:282
uint32 GetCreateMana() const
Definition Unit.h:1133

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15302{
15303 if (IsPlayer())
15304 {
15306 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15307 if (ssEntry && ssEntry->creatureType > 0)
15308 return ssEntry->creatureType;
15309 else
15311 }
15312 else
15313 return ToCreature()->GetCreatureTemplate()->type;
15314}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2635
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1936
uint32 type
Definition CreatureData.h:218
Definition DBCStructure.h:1817
int32 creatureType
Definition DBCStructure.h:1823

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
819 {
820 uint32 creatureType = GetCreatureType();
821 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
822 }
uint32 GetCreatureType() const
Definition Unit.cpp:15301

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1562{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4209{
4210 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4211 return spell->GetCastTime();
4212 return 0;
4213}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4200

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

21440{
21441 std::stringstream sstr;
21442 sstr << WorldObject::GetDebugInfo() << "\n"
21443 << std::boolalpha
21444 << "AliveState: " << IsAlive()
21445 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21446 << " Class: " << std::to_string(getClass());
21447 return sstr.str();
21448}
std::string GetDebugInfo() const override
Definition Object.cpp:2507

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16871{
16872 return IDLE_MOTION_TYPE;
16873}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3651{
3652 if (IsPlayer())
3653 {
3654 // in PvP use full skill instead current skill value
3655 uint32 value = (target && target->IsPlayer())
3658 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3659 return value;
3660 }
3661 else
3662 return GetUnitMeleeSkill(target);
3663}
@ SKILL_DEFENSE
Definition SharedDefines.h:3121
@ CR_DEFENSE_SKILL
Definition Unit.h:225
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5443
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5460

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15122{
15123 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15124 {
15125 if (i->DRGroup != group)
15126 continue;
15127
15128 if (!i->hitCount)
15129 return DIMINISHING_LEVEL_1;
15130
15131 if (!i->hitTime)
15132 return DIMINISHING_LEVEL_1;
15133
15134 // If last spell was casted more than 15 seconds ago - reset the count.
15135 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15136 {
15137 i->hitCount = DIMINISHING_LEVEL_1;
15138 return DIMINISHING_LEVEL_1;
15139 }
15140 // or else increase the count.
15141 else
15142 return DiminishingLevels(i->hitCount);
15143 }
15144 return DIMINISHING_LEVEL_1;
15145}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5971{
5972 static const AuraType diseaseAuraTypes[] =
5973 {
5974 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5975 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5977 };
5978
5979 ObjectGuid drwGUID;
5980
5981 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5982 drwGUID = playerCaster->getRuneWeaponGUID();
5983
5984 uint32 diseases = 0;
5985 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5986 {
5987 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5988 {
5989 // Get auras with disease dispel type by caster
5990 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5991 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5992 {
5993 ++diseases;
5994
5995 if (mode == 1)
5996 {
5997 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5998 i = m_modAuras[diseaseAuraTypes[index]].begin();
5999 continue;
6000 }
6001 // used for glyph of scourge strike
6002 else if (mode == 2)
6003 {
6004 Aura* aura = (*i)->GetBase();
6005 uint32 countMin = aura->GetMaxDuration();
6006 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
6007
6008 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
6009 countMax += epidemic->GetAmount();
6010
6011 if (countMin < countMax)
6012 {
6013 aura->SetDuration(uint32(aura->GetDuration() + 3000));
6014 aura->SetMaxDuration(countMin + 3000);
6015 }
6016 }
6017 }
6018 ++i;
6019 }
6020 }
6021 return diseases;
6022}
@ EFFECT_0
Definition SharedDefines.h:31
@ DISPEL_DISEASE
Definition SharedDefines.h:1386
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:130
int32 GetMaxDuration() const
Definition SpellInfo.cpp:2239
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5634

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5732{
5733 // we should not be able to dispel diseases if the target is affected by unholy blight
5734 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5735 dispelMask &= ~(1 << DISPEL_DISEASE);
5736
5737 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5738 bool positive = rank >= REP_FRIENDLY;
5739
5740 // Neutral unit not at war with caster should be treated as a friendly unit
5741 if (rank == REP_NEUTRAL)
5742 {
5743 if (Player* casterPlayer = caster->GetAffectingPlayer())
5744 {
5745 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5746 {
5747 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5748 {
5749 if (factionEntry->CanBeSetAtWar())
5750 {
5751 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5752 }
5753 }
5754 }
5755 }
5756 }
5757
5758 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5759 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5760 {
5761 Aura* aura = itr->second->GetBase();
5762
5763 // don't try to remove passive auras
5764 if (aura->IsPassive())
5765 continue;
5766
5767 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5768 {
5769 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5770 {
5771 // do not remove positive auras if friendly target
5772 // negative auras if non-friendly target
5773 if (itr->second->IsPositive() == positive)
5774 continue;
5775 }
5776
5777 // Banish should only be dispelled by Mass Dispel
5778 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5779 {
5780 continue;
5781 }
5782
5783 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5784 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5785 // Polymorph instead of 1 / (5 + 1) -> 16%.
5786 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5787 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5788 if (charges > 0)
5789 dispelList.push_back(std::make_pair(aura, charges));
5790 }
5791 }
5792}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition SharedDefines.h:662
@ MECHANIC_BANISH
Definition SharedDefines.h:1354
@ SPELL_ATTR0_NO_IMMUNITIES
Definition SharedDefines.h:422
@ REP_FRIENDLY
Definition SharedDefines.h:184
@ DISPEL_MAGIC
Definition SharedDefines.h:1384
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1034
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5847
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:677
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1524

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition Unit.cpp:21128
uint32 GetDisplayId() const
Definition Unit.h:1953

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21129{
21130 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21131 {
21132 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21133 {
21134 return DisplayRace(displayExtra->DisplayRaceID);
21135 }
21136 }
21137 return DisplayRace::None;
21138}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
6025{
6026 static const AuraType diseaseAuraTypes[] =
6027 {
6031 };
6032
6033 uint32 dots = 0;
6034 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
6035 {
6036 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
6037 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
6038 {
6039 // Get auras by caster
6040 if ((*i)->GetCasterGUID() == casterGUID)
6041 ++dots;
6042 }
6043 }
6044 return dots;
6045}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6363{
6364 if (m_dynObj.empty())
6365 return nullptr;
6366 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6367 {
6368 DynamicObject* dynObj = *i;
6369 if (dynObj->GetSpellId() == spellId)
6370 return dynObj;
6371 }
6372 return nullptr;
6373}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2150{
2151 float victimResistance = static_cast<float>(victim->GetResistance(schoolMask));
2152 if (owner)
2153 {
2154 // Xinef: pets inherit 100% of masters penetration
2155 // Xinef: excluding traps
2156 Player const* player = owner->GetSpellModOwner();
2157 if (player && owner->GetEntry() != WORLD_TRIGGER)
2158 {
2159 victimResistance += static_cast<float>(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2160 victimResistance -= static_cast<float>(player->GetSpellPenetrationItemMod());
2161 }
2162 else
2163 victimResistance += static_cast<float>(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2164 }
2165
2166 victimResistance = std::max(victimResistance, 0.0f);
2167 if (owner)
2168 victimResistance += std::max(static_cast<float>(victim->GetLevel() - owner->GetLevel()) * 5.0f, 0.0f);
2169
2170 float level = static_cast<float>(victim->GetLevel());
2171 float resistanceConstant = 0.0f;
2172
2173 if (level > 60.0f)
2174 resistanceConstant = 150.0f + (level - 60.0f) * (level - 67.5f);
2175 else if (level > 20.0f)
2176 resistanceConstant = 50.0f + (level - 20.0f) * 2.5f;
2177 else
2178 resistanceConstant = 50.0f;
2179
2180 return std::min(victimResistance / (victimResistance + resistanceConstant), 0.75f);
2181}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1990

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::PassengerBoarded(), npc_frosthound::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10370{
10371 // always neutral when no template entry found
10372 if (!factionTemplateEntry)
10373 return REP_NEUTRAL;
10374
10375 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10376 if (!targetFactionTemplateEntry)
10377 return REP_NEUTRAL;
10378
10379 // xinef: check forced reputation for self also
10380 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10381 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10382 return *repRank;
10383
10384 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10385 {
10386 // check contested flags
10387 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10388 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10389 return REP_HOSTILE;
10390 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10391 return *repRank;
10392 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10393 {
10394 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10395 {
10396 if (factionEntry->CanHaveReputation())
10397 {
10398 // CvP case - check reputation, don't allow state higher than neutral when at war
10399 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10400 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10401 repRank = std::min(REP_NEUTRAL, repRank);
10402 return repRank;
10403 }
10404 }
10405 }
10406 }
10407
10408 // common faction based check
10409 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10410 return REP_HOSTILE;
10411 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10412 return REP_FRIENDLY;
10413 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10414 return REP_FRIENDLY;
10415 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10416 return REP_HOSTILE;
10417 // neutral by default
10418 return REP_NEUTRAL;
10419}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:295
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10220{
10221 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10222 if (!entry)
10223 {
10224 static ObjectGuid guid; // prevent repeating spam same faction problem
10225
10226 if (GetGUID() != guid)
10227 {
10228 if (Player const* player = ToPlayer())
10229 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10230 else if (Creature const* creature = ToCreature())
10231 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10232 else
10233 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10234
10235 guid = GetGUID();
10236 }
10237 }
10238 return entry;
10239}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:841
std::string const & GetName() const
Definition Object.h:524

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11292{
11293 // Sequence: charmed, pet, other guardians
11294 Unit* unit = GetCharm();
11295 if (!unit)
11296 if (ObjectGuid guid = GetMinionGUID())
11297 unit = ObjectAccessor::GetUnit(*this, guid);
11298
11299 return unit;
11300}
ObjectGuid GetMinionGUID() const
Definition Unit.h:707

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4192{
4193 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4194 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4195 return m_currentSpells[i];
4196
4197 return nullptr;
4198}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10847{
10848 if (ObjectGuid pet_guid = GetMinionGUID())
10849 {
10850 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10851 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10852 return (Minion*)pet;
10853
10854 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10855 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10856 }
10857
10858 return nullptr;
10859}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:708
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const &)
Definition ObjectAccessor.cpp:234

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFlatModifierValue()

float Unit::GetFlatModifierValue ( UnitMods  unitMod,
UnitModifierFlatType  modifierType 
) const

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6404{
6405 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6406 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6407 if (go->GetSpellId() == spellId)
6408 return go;
6409
6410 return nullptr;
6411}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10862{
10863 if (ObjectGuid pet_guid = GetPetGUID())
10864 {
10865 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10866 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10867 return (Guardian*)pet;
10868
10869 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10870 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10871 }
10872
10873 return nullptr;
10874}
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
Definition TemporarySummon.h:106
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:712
ObjectGuid GetPetGUID() const
Definition Unit.h:713

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), boss_yoggsaron_immortal_guardian::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_wild_wyrm::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_anub_arak::DamageTaken(), boss_razorscale::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::DamageTaken(), boss_kologarn_arms::DamageTaken(), boss_thorim::DamageTaken(), boss_yoggsaron_sara::DamageTaken(), DealDamage(), DealDamageShieldDamage(), boss_xt002::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), spell_gluth_decimate_damage::PrepareSpellScript(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_flame_leviathan_defense_turret::UpdateAI(), boss_razorscale::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14306{
14307 int32 gain = 0;
14308
14309 if (dVal == 0)
14310 return 0;
14311
14312 int32 curHealth = (int32)GetHealth();
14313
14314 int32 val = dVal + curHealth;
14315 if (val <= 0)
14316 {
14317 return -curHealth;
14318 }
14319
14320 int32 maxHealth = (int32)GetMaxHealth();
14321
14322 if (val < maxHealth)
14323 gain = dVal;
14324 else if (curHealth != maxHealth)
14325 gain = maxHealth - curHealth;
14326
14327 return gain;
14328}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ GetHighestExclusiveSameEffectSpellGroupValue()

int32 Unit::GetHighestExclusiveSameEffectSpellGroupValue ( AuraEffect const *  aurEff,
AuraType  auraType,
bool  checkMiscValue = false,
int32  miscValue = 0 
) const
4411{
4412 int32 val = 0;
4413 SpellSpellGroupMapBounds spellGroup = sSpellMgr->GetSpellSpellGroupMapBounds(aurEff->GetSpellInfo()->GetFirstRankSpell()->Id);
4414 for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second ; ++itr)
4415 {
4416 if (sSpellMgr->GetSpellGroupStackRule(itr->second) == SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT)
4417 {
4418 AuraEffectList const& auraEffList = GetAuraEffectsByType(auraType);
4419 for (AuraEffectList::const_iterator auraItr = auraEffList.begin(); auraItr != auraEffList.end(); ++auraItr)
4420 {
4421 if (aurEff != (*auraItr) && (!checkMiscValue || (*auraItr)->GetMiscValue() == miscValue) &&
4422 sSpellMgr->IsSpellMemberOfSpellGroup((*auraItr)->GetSpellInfo()->Id, itr->second))
4423 {
4424 // absolute value only
4425 if (abs(val) < abs((*auraItr)->GetAmount()))
4426 val = (*auraItr)->GetAmount();
4427 }
4428 }
4429 }
4430 }
4431 return val;
4432}
std::pair< SpellSpellGroupMap::const_iterator, SpellSpellGroupMap::const_iterator > SpellSpellGroupMapBounds
Definition SpellMgr.h:357
@ SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT
Definition SpellMgr.h:368

References GetAuraEffectsByType(), SpellInfo::GetFirstRankSpell(), AuraEffect::GetSpellInfo(), SpellInfo::Id, SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT, and sSpellMgr.

Referenced by AuraEffect::HandleAuraModStat(), AuraEffect::HandleModCastingSpeed(), AuraEffect::HandleModCombatSpeedPct(), and AuraEffect::HandleModMeleeSpeedPct().

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1588{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
957{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
995{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Creature::CanResetTalents(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), CreateTamedPetFrom(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), spell_gen_filter_party_level_80::FilterTargets(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Trainer::Trainer::GetSpellState(), Player::GetsRecruitAFriendBonus(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11236{
11237 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11238 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11239 return victim;
11240
11242 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11243 {
11244 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11245 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11246 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11247 && _IsValidAttackTarget(magnet, spellInfo)
11248 /*&& IsWithinLOSInMap(magnet)*/)
11249 {
11250 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11251 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11252
11253 if (magnet->IsTotem())
11254 {
11255 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11256 if (spellInfo->Speed > 0.0f)
11257 {
11258 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11259 if (dist < 5.0f)
11260 dist = 5.0f;
11261 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11262 }
11263
11264 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11265 }
11266
11267 return magnet;
11268 }
11269 }
11270 return victim;
11271}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:433
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:397
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2303
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:14044
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1271

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), Battleground::AddPlayer(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_razorscale::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::DamageTaken(), boss_yoggsaron_sara::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::DoAction(), npc_xt002_heart::DoAction(), boss_yoggsaron::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), spell_pal_lay_on_hands::HandleMaxHealthHeal(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_spark(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_flame_leviathan_defense_turret::UpdateAI(), boss_razorscale::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier() [1/2]

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const

◆ GetMaxNegativeAuraModifier() [2/2]

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6118{
6119 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6120 if (mTotalAuraList.empty())
6121 return 0;
6122
6123 int32 modifier = 0;
6124 for (AuraEffect const* aurEff : mTotalAuraList)
6125 {
6126 if (predicate(aurEff))
6127 modifier = std::min(modifier, aurEff->GetAmount());
6128 }
6129
6130 return modifier;
6131}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6264{
6265 return GetMaxNegativeAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6266 {
6267 if (aurEff->IsAffectedOnSpell(affectedSpell))
6268 return true;
6269 return false;
6270 });
6271}

References GetMaxNegativeAuraModifier(), and AuraEffect::IsAffectedOnSpell().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6184{
6185 return GetMaxNegativeAuraModifier(auraType, [miscMask](AuraEffect const* aurEff) -> bool
6186 {
6187 if ((aurEff->GetMiscValue() & miscMask) != 0)
6188 return true;
6189 return false;
6190 });
6191}

References GetMaxNegativeAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6224{
6225 return GetMaxNegativeAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6226 {
6227 if (aurEff->GetMiscValue() == miscValue)
6228 return true;
6229 return false;
6230 });
6231}

References GetMaxNegativeAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier() [1/2]

◆ GetMaxPositiveAuraModifier() [2/2]

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6102{
6103 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6104 if (mTotalAuraList.empty())
6105 return 0;
6106
6107 int32 modifier = 0;
6108 for (AuraEffect const* aurEff : mTotalAuraList)
6109 {
6110 if (predicate(aurEff))
6111 modifier = std::max(modifier, aurEff->GetAmount());
6112 }
6113
6114 return modifier;
6115}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6254{
6255 return GetMaxPositiveAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6256 {
6257 if (aurEff->IsAffectedOnSpell(affectedSpell))
6258 return true;
6259 return false;
6260 });
6261}

References GetMaxPositiveAuraModifier(), and AuraEffect::IsAffectedOnSpell().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6174{
6175 return GetMaxPositiveAuraModifier(auraType, [miscMask, except](AuraEffect const* aurEff) -> bool
6176 {
6177 if (except != aurEff && (aurEff->GetMiscValue() & miscMask) != 0)
6178 return true;
6179 return false;
6180 });
6181}

References GetMaxPositiveAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by CalcAbsorbResist(), AuraEffect::HandleAuraModResistanceExclusive(), SpellTakenCritChance(), and UpdateResistanceBuffModsMod().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6214{
6215 return GetMaxPositiveAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6216 {
6217 if (aurEff->GetMiscValue() == miscValue)
6218 return true;
6219 return false;
6220 });
6221}

References GetMaxPositiveAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1121{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1189{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1089

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3168{
3169 if (!spell)
3170 return 0;
3171 int32 resist_mech = 0;
3172 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3173 {
3174 if (!spell->Effects[eff].IsEffect())
3175 break;
3176 int32 effect_mech = spell->GetEffectMechanic(eff);
3177 if (effect_mech)
3178 {
3180 if (resist_mech < temp)
3181 resist_mech = temp;
3182 }
3183 }
3184 return resist_mech;
3185}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6193

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2704{
2705 if (!attacker)
2706 {
2707 return false;
2708 }
2709
2710 AttackerSet attackers = getAttackers();
2711
2712 if (attackers.size() <= 1) // if the attackers are not more than one
2713 {
2714 return false;
2715 }
2716
2717 float meleeReach = GetExactDist2d(attacker);
2718 if (meleeReach <= 0)
2719 {
2720 return false;
2721 }
2722
2723 float minAngle = 0;
2724 Unit *refUnit = nullptr;
2725 uint32 validAttackers = 0;
2726
2727 double attackerSize = attacker->GetCollisionRadius();
2728
2729 for (auto const& otherAttacker: attackers)
2730 {
2731 // if the otherAttacker is not valid, skip
2732 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2733 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2734 {
2735 continue;
2736 }
2737
2738 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2739 if (minAngle == 0 || curretAngle < minAngle)
2740 {
2741 minAngle = curretAngle;
2742 refUnit = otherAttacker;
2743 }
2744
2745 validAttackers++;
2746 }
2747
2748 if (!validAttackers || !refUnit)
2749 {
2750 return false;
2751 }
2752
2753 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2754 float requiredAngle = atan(contactDist / meleeReach);
2755 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2756
2757 // in instance: the more attacker there are, the higher will be the tollerance
2758 // outside: creatures should not intersecate
2759 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2760
2761 if (attackersAngle > angleTollerance)
2762 {
2763 return false;
2764 }
2765
2766 double angle = atan(contactDist / meleeReach);
2767
2768 float angularRadius = frand(0.1f, 0.3f) + angle;
2769 int8 direction = (urand(0, 1) ? -1 : 1);
2770 float currentAngle = GetAngle(refUnit);
2771 float absAngle = currentAngle + angularRadius * direction;
2772
2773 float x, y, z;
2774 float distance = meleeReach - GetObjectSize();
2775 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2776
2777 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2778 {
2779 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2780
2781 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2782 {
2783 return false;
2784 }
2785 }
2786
2787 pos.Relocate(x, y, z);
2788
2789 return true;
2790}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:295
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition Unit.cpp:21203
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:657
AttackerSet const & getAttackers() const
Definition Unit.h:890
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition Object.cpp:2663
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1259{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition Unit.cpp:19450

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11274{
11276 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11277 {
11278 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11279 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11280 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11281 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11282 if (roll_chance_i((*i)->GetAmount()))
11283 {
11284 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11285 return magnet;
11286 }
11287 }
11288 return victim;
11289}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
684{
685 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
686 return std::max(range, NOMINAL_MELEE_RANGE);
687}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:47
float GetCombatReach() const override
Definition Unit.h:867

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by SmartAI::DistanceYourself(), GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
868{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition ObjectDefines.h:46

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19457{
19458 // Hardcoded cases
19459 switch (spellId)
19460 {
19461 case 7090: // Bear form
19462 return 29414;
19463 case 35200: // Roc form
19464 return 4877;
19465 default:
19466 break;
19467 }
19468
19469 if (IsPlayer())
19470 {
19471 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19472 return ModelId;
19473 }
19474
19475 uint32 modelid = 0;
19476 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19477 if (formEntry && formEntry->modelID_A)
19478 {
19479 // Take the alliance modelid as default
19480 if (!IsPlayer())
19481 return formEntry->modelID_A;
19482 else
19483 {
19485 modelid = formEntry->modelID_A;
19486 else
19487 modelid = formEntry->modelID_H;
19488
19489 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19490 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19491 modelid = formEntry->modelID_A;
19492 }
19493 }
19494
19495 return modelid;
19496}
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5823
uint8 getRace(bool original=false) const
Definition Unit.cpp:21109
uint32 modelID_H
Definition DBCStructure.h:1827
uint32 modelID_A
Definition DBCStructure.h:1826

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1738{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::AttackStart(), npc_nexus_lord::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_wild_wyrm::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), SmartAI::DistanceYourself(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_hadronox_crusherPackAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::DoAction(), npc_brann_bronzebeard_algalon::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::DoAction(), npc_hover_disk::DoAction(), npc_spark_of_ionar::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), go_commandscript::DoTeleportToTransport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::EndBattle(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_dragonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::JustSummoned(), npc_frosthound::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::JustSummoned(), boss_sartharion::JustSummoned(), boss_novos::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_overlord_drakuru_betrayal::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), npc_crystalline_frayer::LeaveSeedPod(), Creature::Motion_Initialize(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_volkhan::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_wild_wyrm::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_star(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vapors(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::PassengerBoarded(), npc_wild_wyrm::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_hover_disk::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_crystalline_frayer::Reset(), npc_assembly_lightning::Reset(), boss_kologarn::Reset(), npc_xt002_scrapbot::Reset(), npc_xt002_boombot::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_loken::ScheduleTasks(), boss_laj::ScheduleTasks(), Map::ScriptsProcess(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::UpdateAI(), npc_power_spark::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_spark_of_ionar::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_brann_bronzebeard_algalon::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_flame_leviathan::UpdateAI(), npc_hodirs_fury::UpdateAI(), boss_flame_leviathan_safety_container::UpdateAI(), npc_mechanolift::UpdateAI(), boss_mimiron::UpdateAI(), npc_ulduar_aerial_command_unit::UpdateAI(), npc_ulduar_emergency_fire_bot::UpdateAI(), boss_razorscale::UpdateAI(), npc_ulduar_expedition_engineer::UpdateAI(), boss_yoggsaron_death_orb::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::UpdateAI(), npc_xt002_boombot::UpdateAI(), Player::UpdateCharmedAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1739{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1951{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1052{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11331{
11332 Player* player = nullptr;
11333 if (IsPlayer())
11334 player = ToPlayer();
11335 // Should we enable this also for charmed units?
11336 else if (IsCreature() && IsPet())
11337 player = GetOwner()->ToPlayer();
11338
11339 if (!player)
11340 return nullptr;
11341 Group* group = player->GetGroup();
11342 // When there is no group check pet presence
11343 if (!group)
11344 {
11345 // We are pet now, return owner
11346 if (player != this)
11347 return IsWithinDistInMap(player, radius) ? player : nullptr;
11348 Unit* pet = GetGuardianPet();
11349 // No pet, no group, nothing to return
11350 if (!pet)
11351 return nullptr;
11352 // We are owner now, return pet
11353 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11354 }
11355
11356 std::vector<Unit*> nearMembers;
11357 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11358 nearMembers.reserve(group->GetMembersCount() * 2);
11359
11360 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11361 if (Player* Target = itr->GetSource())
11362 {
11363 if (Target != this && !IsWithinDistInMap(Target, radius))
11364 continue;
11365
11366 // IsHostileTo check duel and controlled by enemy
11367 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11368 nearMembers.push_back(Target);
11369
11370 // Push player's pet to vector
11371 if (Unit* pet = Target->GetGuardianPet())
11372 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11373 nearMembers.push_back(pet);
11374 }
11375
11376 if (nearMembers.empty())
11377 return nullptr;
11378
11379 uint32 randTarget = urand(0, nearMembers.size() - 1);
11380 return nearMembers[randTarget];
11381}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2501
Guardian * GetGuardianPet() const
Definition Unit.cpp:10861
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1347

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
845{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4880{
4881 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4882 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4883 {
4884 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4885 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4886 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4887 && (!except || except != itr->second))
4888 {
4889 return itr->second;
4890 }
4891 }
4892 return nullptr;
4893}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:661

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1359{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10811{
10812 if (ObjectGuid ownerGUID = GetOwnerGUID())
10813 return ObjectAccessor::GetUnit(*this, ownerGUID);
10814
10815 return nullptr;
10816}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), spell_warl_generic_scaling::CalculateAPAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), spell_item_fetch_ball::SelectTarget(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
19078{
19079 Unit* owner = GetCharmerOrOwnerOrSelf();
19080 Group* group = nullptr;
19081 if (owner->IsPlayer())
19082 group = owner->ToPlayer()->GetGroup();
19083
19084 if (group)
19085 {
19086 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
19087
19088 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
19089 {
19090 Player* Target = itr->GetSource();
19091
19092 // IsHostileTo check duel and controlled by enemy
19093 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
19094 {
19095 if (Target->IsAlive())
19096 TagUnitMap.push_back(Target);
19097
19098 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
19099 {
19100 if (Unit* pet = *iterator)
19101 if (pet->IsGuardian() && pet->IsAlive())
19102 TagUnitMap.push_back(pet);
19103 }
19104 }
19105 }
19106 }
19107 else
19108 {
19109 if (owner->IsAlive())
19110 TagUnitMap.push_back(owner);
19111
19112 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
19113 {
19114 if (Unit* pet = *itr)
19115 if (pet->IsGuardian() && pet->IsAlive())
19116 TagUnitMap.push_back(pet);
19117 }
19118 }
19119}
uint8 GetSubGroup() const
Definition Player.h:2505

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPctModifierValue()

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19297{
19298 uint32 currentPhase = 0;
19300 if (!phases.empty())
19301 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19302 currentPhase |= (*itr)->GetMiscValue();
19303
19304 return currentPhase;
19305}
@ SPELL_AURA_PHASE
Definition SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1051{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1120{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1122{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1121
uint32 GetPower(Powers power) const
Definition Unit.h:1120

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15651{
15652 switch (unitMod)
15653 {
15654 case UNIT_MOD_RAGE:
15655 return POWER_RAGE;
15656 case UNIT_MOD_FOCUS:
15657 return POWER_FOCUS;
15658 case UNIT_MOD_ENERGY:
15659 return POWER_ENERGY;
15660 case UNIT_MOD_HAPPINESS:
15661 return POWER_HAPPINESS;
15662 case UNIT_MOD_RUNE:
15663 return POWER_RUNE;
15665 return POWER_RUNIC_POWER;
15666 default:
15667 case UNIT_MOD_MANA:
15668 return POWER_MANA;
15669 }
15670}
@ UNIT_MOD_RUNE
Definition Unit.h:161
@ UNIT_MOD_ENERGY
Definition Unit.h:159
@ UNIT_MOD_FOCUS
Definition Unit.h:158
@ UNIT_MOD_HAPPINESS
Definition Unit.h:160
@ UNIT_MOD_MANA
Definition Unit.h:156
@ UNIT_MOD_RAGE
Definition Unit.h:157
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:162

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by UpdateUnitMod().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13610{
13611 // proc per minute chance calculation
13612 if (PPM <= 0)
13613 return 0.0f;
13614
13615 // Apply chance modifer aura
13616 if (spellProto)
13617 if (Player* modOwner = GetSpellModOwner())
13618 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13619
13620 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13621}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16740{
16741 // use provided list of auras which can proc
16742 if (procAuras)
16743 {
16744 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16745 {
16746 ASSERT((*itr)->GetTarget() == this);
16747 if (!(*itr)->GetRemoveMode())
16748 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16749 {
16750 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16751 aurasTriggeringProc.push_back(*itr);
16752 }
16753 }
16754 }
16755 // or generate one on our own
16756 else
16757 {
16758 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16759 {
16760 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16761 {
16762 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16763 aurasTriggeringProc.push_back(itr->second);
16764 }
16765 }
16766 }
16767}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
21110{
21111 if (IsPlayer())
21112 {
21113 if (original)
21114 return m_realRace;
21115 else
21116 return m_race;
21117 }
21118
21120}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsSpellFitByClassAndRace(), Trainer::Trainer::IsTrainerValidForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
715{
716 float combat_reach = GetCombatReach();
717 if (combat_reach < 0.1f) // sometimes bugged for players
718 combat_reach = DEFAULT_COMBAT_REACH;
719
720 uint32 attacker_number = getAttackers().size();
721 if (attacker_number > 0)
722 --attacker_number;
723 Creature const* c = obj->ToCreature();
724 if (c)
725 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
726 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
727
728 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
729 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
730
731 // pussywizard
732 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
733 {
734 x = this->GetPositionX();
735 y = this->GetPositionY();
736 z = this->GetPositionZ();
737 obj->UpdateAllowedPositionZ(x, y, z);
738 }
739 float maxDist = GetMeleeRange(obj);
740 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
741 {
742 if (force)
743 {
744 x = this->GetPositionX();
745 y = this->GetPositionY();
746 z = this->GetPositionZ();
747 return true;
748 }
749 return false;
750 }
751 return true;
752}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
bool IsDungeonBoss() const
Definition Creature.cpp:3123
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:21209
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:683
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1352
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10250{
10251 // always friendly to self
10252 if (this == target)
10253 return REP_FRIENDLY;
10254
10255 // always friendly to charmer or owner
10257 return REP_FRIENDLY;
10258
10259 Player const* selfPlayerOwner = GetAffectingPlayer();
10260 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10261
10262 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10263 if (selfPlayerOwner)
10264 {
10265 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10266 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10267 return *repRank;
10268 }
10269 else if (targetPlayerOwner)
10270 {
10271 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10272 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10273 return *repRank;
10274 }
10275
10277 {
10278 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10279 {
10280 if (selfPlayerOwner && targetPlayerOwner)
10281 {
10282 // always friendly to other unit controlled by player, or to the player himself
10283 if (selfPlayerOwner == targetPlayerOwner)
10284 return REP_FRIENDLY;
10285
10286 // duel - always hostile to opponent
10287 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10288 return REP_HOSTILE;
10289
10290 // same group - checks dependant only on our faction - skip FFA_PVP for example
10291 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10292 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10293 // however client seems to allow mixed group parties, because in 13850 client it works like:
10294 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10295 }
10296
10297 // check FFA_PVP
10298 if (IsFFAPvP() && target->IsFFAPvP())
10299 return REP_HOSTILE;
10300
10301 if (selfPlayerOwner)
10302 {
10303 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10304 {
10305 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10306 return *repRank;
10307 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10308 {
10309 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10310 {
10311 if (targetFactionEntry->CanHaveReputation())
10312 {
10313 // check contested flags
10314 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10315 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10316 return REP_HOSTILE;
10317
10318 // if faction has reputation, hostile state depends only from AtWar state
10319 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10320 return REP_HOSTILE;
10321 return REP_FRIENDLY;
10322 }
10323 }
10324 }
10325 }
10326 }
10327 }
10328 }
10329
10330 ReputationRank repRank = REP_HATED;
10331 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10332 {
10333 return ReputationRank(repRank);
10334 }
10335
10336 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10337 if (checkOriginalFaction)
10338 {
10339 if (IsPlayer())
10340 {
10341 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10342 {
10343 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10344 }
10345 }
10346 else
10347 {
10348 Unit* owner = GetOwner();
10349 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10350 {
10351 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10352 }
10353 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10354 {
10355 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10356 }
10357 }
10358 }
10359
10360 if (!factionTemplateEntry)
10361 {
10362 factionTemplateEntry = GetFactionTemplateEntry();
10363 }
10364
10365 // do checks dependant only on our faction
10366 return GetFactionReactionTo(factionTemplateEntry, target);
10367}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1124
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10369
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:19055
Definition DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition ThreatMgr.h:303

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20320{
20321 int32 resist = -1;
20322 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20323 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20324 resist = int32(GetResistance(SpellSchools(i)));
20325
20326 // resist value will never be negative here
20327 return uint32(resist);
20328}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1182{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1161 {
1162 uint32 value = GetShieldBlockValue();
1163 if (value >= hard_cap)
1164 {
1165 value = (soft_cap + hard_cap) / 2;
1166 }
1167 else if (value > soft_cap)
1168 {
1169 value = soft_cap + ((value - soft_cap) / 2);
1170 }
1171
1172 return value;
1173 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1415{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15262{
15263 if (!spellInfo->RangeEntry)
15264 {
15265 return 0;
15266 }
15267
15268 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15269 {
15270 return spellInfo->GetMaxRange();
15271 }
15272
15273 if (!target)
15274 {
15275 return spellInfo->GetMaxRange(true);
15276 }
15277
15278 return spellInfo->GetMaxRange(!IsHostileTo(target));
15279}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15282{
15283 if (!spellInfo->RangeEntry)
15284 {
15285 return 0;
15286 }
15287
15288 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15289 {
15290 return spellInfo->GetMinRange();
15291 }
15292
15293 return spellInfo->GetMinRange(!IsHostileTo(target));
15294}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16804{
16805 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16806 {
16807 return player;
16808 }
16809
16810 if (Unit* owner = GetOwner())
16811 {
16812 if (Player* player = owner->ToPlayer())
16813 {
16814 return player;
16815 }
16816 }
16817
16818 // Special handling for Eye of Kilrogg
16820 {
16821 if (TempSummon const* tempSummon = ToTempSummon())
16822 {
16823 if (Unit* summoner = tempSummon->GetSummonerUnit())
16824 {
16825 return summoner->ToPlayer();
16826 }
16827 }
16828 }
16829
16830 return nullptr;
16831}
@ NPC_EYE_OF_KILROGG
Definition PetDefines.h:102
Definition TemporarySummon.h:50

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15590{
15592
15593 switch (unitMod)
15594 {
15596 school = SPELL_SCHOOL_HOLY;
15597 break;
15599 school = SPELL_SCHOOL_FIRE;
15600 break;
15602 school = SPELL_SCHOOL_NATURE;
15603 break;
15605 school = SPELL_SCHOOL_FROST;
15606 break;
15608 school = SPELL_SCHOOL_SHADOW;
15609 break;
15611 school = SPELL_SCHOOL_ARCANE;
15612 break;
15613
15614 default:
15615 break;
15616 }
15617
15618 return school;
15619}
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:296
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:295
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:168
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:167
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:164
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:169
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:165
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:166

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by UpdateUnitMod().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15622{
15623 Stats stat = STAT_STRENGTH;
15624
15625 switch (unitMod)
15626 {
15628 stat = STAT_STRENGTH;
15629 break;
15631 stat = STAT_AGILITY;
15632 break;
15634 stat = STAT_STAMINA;
15635 break;
15637 stat = STAT_INTELLECT;
15638 break;
15640 stat = STAT_SPIRIT;
15641 break;
15642
15643 default:
15644 break;
15645 }
15646
15647 return stat;
15648}
Stats
Definition SharedDefines.h:268
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:153
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:154
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:150
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:151
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:152

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by UpdateUnitMod().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
943{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_crystalline_frayer::EnterSeedPod(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), spell_black_knight_ghoul_claw::HandleSpellHit(), boss_thaddius::boss_thaddiusAI::IsAnyPlayerInMeleeRange(), boss_hadronox::IsInCombatWithPlayer(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_eck::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::UpdateAI(), npc_molten_golem::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
944{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15673{
15674 if (attType == RANGED_ATTACK)
15675 {
15677 if (victim)
15678 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15679
15680 if (ap < 0)
15681 return 0.0f;
15683 }
15684 else
15685 {
15687 if (victim)
15688 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15689
15690 if (ap < 0)
15691 return 0.0f;
15693 }
15694}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:288

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier() [1/2]

int32 Unit::GetTotalAuraModifier ( AuraType  auratype) const
6134{
6135 return GetTotalAuraModifier(auraType, [](AuraEffect const* /*aurEff*/) { return true; });
6136}

References GetTotalAuraModifier().

Referenced by Player::AddSpellAndCategoryCooldowns(), CalcArmorReducedDamage(), Aura::CalcDispelChance(), CalculateMeleeDamage(), Player::CalculateReputationGain(), CalculateSpellDamageTaken(), DealMeleeDamage(), Spell::Delayed(), Spell::DelayedChannel(), Creature::GetAggroRange(), Creature::GetAttackDistance(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitMissChance(), GetUnitParryChance(), Player::HandleFall(), isBlockCritical(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), RecalculateObjectScale(), Creature::RegenerateHealth(), Player::RegenerateHealth(), RewardRage(), RollMeleeOutcomeAgainst(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHitResult(), SpellHitResult(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), UpdateDamageDoneMods(), Player::UpdateDodgePercentage(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateMeleeHitChances(), Player::UpdateParryPercentage(), Player::UpdateRangedHitChances(), UpdateResistanceBuffModsMod(), UpdateSpeed(), Player::UpdateSpellCritChance(), Player::UpdateSpellHitChances(), UpdateStatBuffMod(), and Player::UpdateWeaponDependentCritAuras().

◆ GetTotalAuraModifier() [2/2]

int32 Unit::GetTotalAuraModifier ( AuraType  auratype,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6048{
6049 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6050 if (mTotalAuraList.empty())
6051 return 0;
6052
6053 std::map<SpellGroup, int32> sameEffectSpellGroup;
6054 int32 modifier = 0;
6055
6056 for (AuraEffect const* aurEff : mTotalAuraList)
6057 {
6058 if (predicate(aurEff))
6059 {
6060 // Check if the Aura Effect has a the Same Effect Stack Rule and if so, use the highest amount of that SpellGroup
6061 // If the Aura Effect does not have this Stack Rule, it returns false so we can add to the multiplier as usual
6062 if (!sSpellMgr->AddSameEffectStackRuleSpellGroups(aurEff->GetSpellInfo(), static_cast<uint32>(auraType), aurEff->GetAmount(), sameEffectSpellGroup))
6063 modifier += aurEff->GetAmount();
6064 }
6065 }
6066
6067 // Add the highest of the Same Effect Stack Rule SpellGroups to the accumulator
6068 for (auto const& [_, amount] : sameEffectSpellGroup)
6069 modifier += amount;
6070
6071 return modifier;
6072}

References GetAuraEffectsByType(), and sSpellMgr.

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6234{
6235 return GetTotalAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6236 {
6237 if (aurEff->IsAffectedOnSpell(affectedSpell))
6238 return true;
6239 return false;
6240 });
6241}

References GetTotalAuraModifier(), and AuraEffect::IsAffectedOnSpell().

Referenced by Spell::SelectImplicitAreaTargets(), and Spell::SelectImplicitConeTargets().

◆ GetTotalAuraModifierByMiscMask()

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6194{
6195 return GetTotalAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6196 {
6197 if (aurEff->GetMiscValue() == miscValue)
6198 return true;
6199 return false;
6200 });
6201}

References AuraEffect::GetMiscValue(), and GetTotalAuraModifier().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15572{
15573 if (unitMod >= UNIT_MOD_END)
15574 {
15575 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15576 return 0.0f;
15577 }
15578
15579 if (GetPctModifierValue(unitMod, TOTAL_PCT) <= 0.0f)
15580 return 0.0f;
15581
15582 float value = GetFlatModifierValue(unitMod, BASE_VALUE);
15583 value *= GetPctModifierValue(unitMod, BASE_PCT);
15584 value += GetFlatModifierValue(unitMod, TOTAL_VALUE);
15585 value *= GetPctModifierValue(unitMod, TOTAL_PCT);
15586 return value;
15587}
float GetPctModifierValue(UnitMods unitMod, UnitModifierPctType modifierType) const
Definition Unit.cpp:15401
float GetFlatModifierValue(UnitMods unitMod, UnitModifierFlatType modifierType) const
Definition Unit.cpp:15390

References BASE_PCT, BASE_VALUE, GetFlatModifierValue(), GetPctModifierValue(), LOG_ERROR, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier() [1/2]

◆ GetTotalAuraMultiplier() [2/2]

float Unit::GetTotalAuraMultiplier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6075{
6076 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6077 if (mTotalAuraList.empty())
6078 return 1.0f;
6079
6080 std::map<SpellGroup, int32> sameEffectSpellGroup;
6081 float multiplier = 1.0f;
6082
6083 for (AuraEffect const* aurEff : mTotalAuraList)
6084 {
6085 if (predicate(aurEff))
6086 {
6087 // Check if the Aura Effect has a the Same Effect Stack Rule and if so, use the highest amount of that SpellGroup
6088 // If the Aura Effect does not have this Stack Rule, it returns false so we can add to the multiplier as usual
6089 if (!sSpellMgr->AddSameEffectStackRuleSpellGroups(aurEff->GetSpellInfo(), static_cast<uint32>(auraType), aurEff->GetAmount(), sameEffectSpellGroup))
6090 AddPct(multiplier, aurEff->GetAmount());
6091 }
6092 }
6093
6094 // Add the highest of the Same Effect Stack Rule SpellGroups to the multiplier
6095 for (auto itr = sameEffectSpellGroup.begin(); itr != sameEffectSpellGroup.end(); ++itr)
6096 AddPct(multiplier, itr->second);
6097
6098 return multiplier;
6099}

References AddPct(), GetAuraEffectsByType(), and sSpellMgr.

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6244{
6245 return GetTotalAuraMultiplier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6246 {
6247 if (aurEff->IsAffectedOnSpell(affectedSpell))
6248 return true;
6249 return false;
6250 });
6251}

References GetTotalAuraMultiplier(), and AuraEffect::IsAffectedOnSpell().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6204{
6205 return GetTotalAuraMultiplier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6206 {
6207 if (aurEff->GetMiscValue() == miscValue)
6208 return true;
6209 return false;
6210 });
6211}

References AuraEffect::GetMiscValue(), and GetTotalAuraMultiplier().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent(), Creature::Regenerate(), Player::Regenerate(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15556{
15557 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15558
15559 if (GetPctModifierValue(unitMod, TOTAL_PCT) <= 0.0f)
15560 return 0.0f;
15561
15562 // value = ((base_value * base_pct) + total_value) * total_pct
15563 float value = GetFlatModifierValue(unitMod, BASE_VALUE) + GetCreateStat(stat);
15564 value *= GetPctModifierValue(unitMod, BASE_PCT);
15565 value += GetFlatModifierValue(unitMod, TOTAL_VALUE) + additionalValue;
15566 value *= GetPctModifierValue(unitMod, TOTAL_PCT);
15567
15568 return value;
15569}
UnitMods
Definition Unit.h:149
@ UNIT_MOD_STAT_START
Definition Unit.h:177
float GetCreateStat(Stats stat) const
Definition Unit.h:1048

References BASE_PCT, BASE_VALUE, GetCreateStat(), GetFlatModifierValue(), GetPctModifierValue(), TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3728{
3729 if (Player const* player = ToPlayer())
3730 {
3731 if (player->CanBlock())
3732 {
3733 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3734 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3736 }
3737 // is player but has no block ability or no not broken shield equipped
3738 return 0.0f;
3739 }
3740 else
3741 {
3742 if (ToCreature()->IsTotem())
3743 return 0.0f;
3744 else
3745 {
3746 float block = 5.0f;
3748 return block > 0.0f ? block : 0.0f;
3749 }
3750 }
3751}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:678
#define INVENTORY_SLOT_BAG_0
Definition Player.h:657
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3754{
3755 float crit;
3756
3757 if (IsPlayer())
3758 {
3759 switch (attackType)
3760 {
3761 case BASE_ATTACK:
3763 break;
3764 case OFF_ATTACK:
3766 break;
3767 case RANGED_ATTACK:
3769 break;
3770 // Just for good manner
3771 default:
3772 crit = 0.0f;
3773 break;
3774 }
3775 }
3776 else
3777 {
3778 crit = 5.0f;
3781 }
3782
3783 // flat aura mods
3784 if (attackType == RANGED_ATTACK)
3785 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3786 else
3787 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3788
3789 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, [this](AuraEffect const* aurEff)
3790 {
3791 return GetGUID() == aurEff->GetCasterGUID();
3792 });
3793
3794 // reduce crit chance from Rating for players
3795 if (attackType != RANGED_ATTACK)
3796 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3797 else
3798 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3799
3800 // Apply crit chance from defence skill
3801 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3802
3803 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3804 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3805
3806 if (crit < 0.0f)
3807 crit = 0.0f;
3808 return crit;
3809}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition SpellAuraDefines.h:260
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1189

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, AuraEffect::GetCasterGUID(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3666{
3667 if (IsPlayer())
3668 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3669 else
3670 {
3671 if (ToCreature()->IsTotem())
3672 return 0.0f;
3673 else
3674 {
3675 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3677 return dodge > 0.0f ? dodge : 0.0f;
3678 }
3679 }
3680}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2639

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:291
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1175{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3713{
3714 float miss_chance = 5.00f;
3715
3716 if (Player const* player = ToPlayer())
3717 miss_chance += player->GetMissPercentageFromDefence();
3718
3719 if (attType == RANGED_ATTACK)
3721 else
3723
3724 return miss_chance;
3725}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3683{
3684 float chance = 0.0f;
3685
3686 if (Player const* player = ToPlayer())
3687 {
3688 if (player->CanParry())
3689 {
3690 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3691 if (!tmpitem)
3692 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3693
3694 if (tmpitem)
3695 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3696 }
3697 }
3698 else if (IsCreature())
3699 {
3700 if (ToCreature()->isWorldBoss())
3701 chance = 13.4f; // + 0.6 by skill diff
3703 chance = 5.0f;
3704
3705 // Xinef: if aura is present, type should not matter
3707 }
3708
3709 return chance > 0.0f ? chance : 0.0f;
3710}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
733{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1905{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::CanAIAttack(), instance_eye_of_eternity::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMoverRelocation(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::JustDied(), npc_scion_of_eternity::JustDied(), boss_flame_leviathan_defense_turret::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_scion_of_eternity::npc_scion_of_eternity(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), boss_flame_leviathan_seat::PassengerBoarded(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), boss_malygos::UpdateAI(), boss_flame_leviathan_seat::UpdateAI(), boss_flame_leviathan_safety_container::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1904{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::DoAction(), npc_hover_disk::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_auto_repair::HandleScript(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::UpdateAI(), boss_xt002::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_hyldsmeet_protodrake::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
893{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::DamageTaken(), boss_leotheras_the_blind::DemonTime(), SmartAI::DistanceYourself(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::ExecuteEvent(), boss_sartharion_shadron::ExecuteEvent(), boss_sartharion_vesperon::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_attumen::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_nexus_lord::JustEngagedWith(), npc_overlord_drakuru_betrayal::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), boss_dred::boss_dredAI::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::SpellHit(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), npc_twilight_summon::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::UpdateAI(), npc_nexus_lord::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_steelbreaker::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_auriaya_sanctum_sentry::UpdateAI(), boss_flame_leviathan::UpdateAI(), boss_freya_elder_ironbranch::UpdateAI(), boss_freya_summons::UpdateAI(), boss_vezax::UpdateAI(), npc_ulduar_hodir_priest::UpdateAI(), npc_ulduar_hodir_druid::UpdateAI(), npc_ulduar_hodir_shaman::UpdateAI(), npc_ulduar_hodir_mage::UpdateAI(), boss_ignis::UpdateAI(), boss_kologarn::UpdateAI(), npc_ulduar_leviathan_mkii::UpdateAI(), npc_ulduar_aerial_command_unit::UpdateAI(), boss_razorscale::UpdateAI(), npc_ulduar_dark_rune_guardian::UpdateAI(), npc_ulduar_dark_rune_watcher::UpdateAI(), npc_ulduar_dark_rune_sentinel::UpdateAI(), boss_thorim::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), boss_thorim_runic_colossus::UpdateAI(), boss_thorim_ancient_rune_giant::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), npc_xt002_pummeller::UpdateAI(), npc_ulduar_storm_tempered_keeper::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::UpdateAI(), boss_yoggsaron_crusher_tentacle::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21271{
21272 if (slot >= MAX_EQUIPMENT_ITEMS)
21273 return 0;
21274
21276}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1526 {
1527 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1528 if (itr != m_visibleAuras.end())
1529 return itr->second;
1530 return nullptr;
1531 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15697{
15698 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15699 return 0.0f;
15700
15701 return m_weaponDamage[attType][type][damageIndex];
15702}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13599{
13600 // normalized proc chance for weapon attack speed
13601 // (odd formula...)
13603 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13605 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13606 return 0;
13607}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3812{
3813 uint32 value = 0;
3814 if (Player const* player = ToPlayer())
3815 {
3816 Item* item = player->GetWeaponForAttack(attType, true);
3817
3818 // feral or unarmed skill only for base attack
3819 if (attType != BASE_ATTACK && !item)
3820 return 0;
3821
3822 if (IsInFeralForm())
3823 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3824
3825 // weapon skill or (unarmed for base attack)
3826 uint32 skill = SKILL_UNARMED;
3827 if (item)
3828 skill = item->GetSkill();
3829
3830 // in PvP use full skill instead current skill value
3831 value = (target && target->IsControlledByPlayer())
3832 ? player->GetMaxSkillValue(skill)
3833 : player->GetSkillValue(skill);
3834 // Modify value from ratings
3835 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3836 switch (attType)
3837 {
3838 case BASE_ATTACK:
3839 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3840 break;
3841 case OFF_ATTACK:
3842 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3843 break;
3844 case RANGED_ATTACK:
3845 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3846 break;
3847 default:
3848 break;
3849 }
3850 }
3851 else
3852 value = GetUnitMeleeSkill(target);
3853 return value;
3854}
@ SKILL_UNARMED
Definition SharedDefines.h:3147
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:246
@ CR_WEAPON_SKILL
Definition Unit.h:224
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:245
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:244
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1939

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8949{
8950 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8951
8952 switch (dummySpell->SpellFamilyName)
8953 {
8955 switch (dummySpell->Id)
8956 {
8957 // Nevermelting Ice Crystal
8958 case 71564:
8959 RemoveAuraFromStack(71564);
8960 *handled = true;
8961 break;
8962 // Gaseous Bloat
8963 case 70672:
8964 case 72455:
8965 case 72832:
8966 case 72833:
8967 {
8968 if (Unit* caster = triggeredByAura->GetCaster())
8969 if (victim && caster->GetGUID() == victim->GetGUID())
8970 {
8971 *handled = true;
8972 uint32 stack = triggeredByAura->GetStackAmount();
8973 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8974 int32 dmg = 0;
8975 for (uint8 i = 1; i <= stack; ++i)
8976 dmg += mod * i;
8977 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8978 }
8979 break;
8980 }
8981 // Ball of Flames Proc
8982 case 71756:
8983 case 72782:
8984 case 72783:
8985 case 72784:
8986 RemoveAuraFromStack(dummySpell->Id);
8987 *handled = true;
8988 break;
8989 // Discerning Eye of the Beast
8990 case 59915:
8991 {
8992 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8993 *handled = true;
8994 break;
8995 }
8996 // Swift Hand of Justice
8997 case 59906:
8998 {
8999 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
9000 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
9001 *handled = true;
9002 break;
9003 }
9004 }
9005
9006 break;
9007 case SPELLFAMILY_MAGE:
9008 {
9009 // Combustion
9010 switch (dummySpell->Id)
9011 {
9012 case 11129:
9013 {
9014 *handled = true;
9015 Unit* caster = triggeredByAura->GetCaster();
9016 if (!caster || !damage)
9017 return false;
9018
9019 // last charge and crit
9020 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
9021 return true; // charge counting (will removed)
9022
9023 CastSpell(this, 28682, true);
9024
9025 return procEx & PROC_EX_CRITICAL_HIT;
9026 }
9027 // Empowered Fire
9028 case 31656:
9029 case 31657:
9030 case 31658:
9031 {
9032 *handled = true;
9033
9034 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
9035 if (!spInfo)
9036 return false;
9037
9038 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
9039 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
9040 return true;
9041 }
9042 }
9043 break;
9044 }
9046 {
9047 // Blood of the North
9048 // Reaping
9049 // Death Rune Mastery
9050 // xinef: Icon 22 is used for item bonus, skip
9051 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
9052 {
9053 *handled = true;
9054 // Convert recently used Blood Rune to Death Rune
9055 if (Player* player = ToPlayer())
9056 {
9057 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
9058 return false;
9059
9060 // xinef: not true
9061 //RuneType rune = ToPlayer()->GetLastUsedRune();
9062 // can't proc from death rune use
9063 //if (rune == RUNE_DEATH)
9064 // return false;
9065 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
9066 if (!aurEff)
9067 return false;
9068
9069 // Reset amplitude - set death rune remove timer to 30s
9070 aurEff->ResetPeriodic(true);
9071 uint32 runesLeft;
9072
9073 if (dummySpell->SpellIconID == 2622)
9074 runesLeft = 2;
9075 else
9076 runesLeft = 1;
9077
9078 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
9079 {
9080 if (dummySpell->SpellIconID == 2622)
9081 {
9082 if (player->GetCurrentRune(i) == RUNE_DEATH ||
9083 player->GetBaseRune(i) == RUNE_BLOOD)
9084 continue;
9085 }
9086 else
9087 {
9088 if (player->GetCurrentRune(i) == RUNE_DEATH ||
9089 player->GetBaseRune(i) != RUNE_BLOOD)
9090 continue;
9091 }
9092 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
9093 continue;
9094
9095 --runesLeft;
9096 // Mark aura as used
9097 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
9098 }
9099 return true;
9100 }
9101 return false;
9102 }
9103 break;
9104 }
9106 {
9107 switch (dummySpell->Id)
9108 {
9109 // Item - Warrior T10 Protection 4P Bonus
9110 case 70844:
9111 {
9112 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
9113 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
9114 break;
9115 }
9116 default:
9117 break;
9118 }
9119 break;
9120 }
9121 case SPELLFAMILY_SHAMAN:
9122 {
9123 // Flurry
9124 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
9125 {
9126 if (cooldown)
9127 {
9128 if (HasSpellCooldown(dummySpell->Id))
9129 {
9130 *handled = true;
9131 break;
9132 }
9133
9134 AddSpellCooldown(dummySpell->Id, 0, cooldown);
9135 }
9136 }
9137 break;
9138 }
9139 }
9140 return false;
9141}
@ RUNE_DEATH
Definition Player.h:400
@ RUNE_BLOOD
Definition Player.h:397
@ EFFECT_1
Definition SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3787
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3784
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3788
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3795
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3799
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:176
uint8 GetSpawnMode() const
Definition Map.h:267
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1320
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1322
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5044

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17919{
17920 // aura can be deleted at casts
17921 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17922
17923 uint32 damageSpellId;
17924 switch (spellProto->Id)
17925 {
17926 case 57949: // shiver
17927 damageSpellId = 57952;
17928 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17929 break;
17930 case 59978: // shiver
17931 damageSpellId = 59979;
17932 break;
17933 case 43593: // Cold Stare
17934 damageSpellId = 43594;
17935 break;
17936 default:
17937 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17938 return false;
17939 }
17940
17941 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17942
17943 // jumps
17944 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17945
17946 // current aura expire
17947 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17948
17949 // next target selection
17950 if (jumps > 0)
17951 {
17952 if (Unit* caster = triggeredByAura->GetCaster())
17953 {
17954 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17955 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17956 {
17957 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17958 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17959 aura->SetCharges(jumps);
17960 }
17961 }
17962 }
17963
17964 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17965
17966 return true;
17967}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:894
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11330

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17830{
17831 // aura can be deleted at casts
17832 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17833 int32 heal = triggeredByAura->GetAmount();
17834 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17835
17836 // Currently only Prayer of Mending
17837 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17838 {
17839 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17840 return false;
17841 }
17842
17843 // jumps
17844 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17845
17846 // current aura expire
17847 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17848
17849 // next target selection
17850 if (jumps > 0)
17851 {
17852 if (Unit* caster = triggeredByAura->GetCaster())
17853 {
17854 // smart healing
17855 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17856 std::list<Unit*> nearMembers;
17857
17858 Player* player = nullptr;
17859 if (IsPlayer())
17860 player = ToPlayer();
17861 else if (GetOwner())
17862 player = GetOwner()->ToPlayer();
17863
17864 if (player)
17865 {
17866 Group* group = player->GetGroup();
17867 if (!group)
17868 {
17869 if (player != this)
17870 {
17871 if (IsWithinDistInMap(player, radius))
17872 nearMembers.push_back(player);
17873 }
17874 else if (Unit* pet = GetGuardianPet())
17875 {
17876 if (IsWithinDistInMap(pet, radius))
17877 nearMembers.push_back(pet);
17878 }
17879 }
17880 else
17881 {
17882 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17883 if (Player* Target = itr->GetSource())
17884 {
17885 if (Target != this && !IsWithinDistInMap(Target, radius))
17886 continue;
17887
17888 // IsHostileTo check duel and controlled by enemy
17889 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17890 nearMembers.push_back(Target);
17891
17892 // Push player's pet to vector
17893 if (Unit* pet = Target->GetGuardianPet())
17894 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17895 nearMembers.push_back(pet);
17896 }
17897 }
17898
17899 if (!nearMembers.empty())
17900 {
17901 nearMembers.sort(Acore::HealthPctOrderPred());
17902 if (Unit* target = nearMembers.front())
17903 {
17904 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17905 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17906 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17907 aura->SetCharges(jumps);
17908 }
17909 }
17910 }
17911 }
17912 }
17913
17914 // heal
17915 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17916 return true;
17917}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3790
Definition Unit.h:2277

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6823{
6824 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6825 uint32 effIndex = triggeredByAura->GetEffIndex();
6826 int32 triggerAmount = triggeredByAura->GetAmount();
6827 Spell const* spellProc = eventInfo.GetProcSpell();
6828
6829 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6830 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6831
6832 uint32 triggered_spell_id = 0;
6833 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6834 // otherwise, it's the triggered_spell_id by default
6835 Unit* target = victim;
6836 int32 basepoints0 = 0;
6837 ObjectGuid originalCaster;
6838
6839 switch (dummySpell->SpellFamilyName)
6840 {
6842 {
6843 switch (dummySpell->Id)
6844 {
6845 // Overkill
6846 case 58426:
6847 {
6848 triggered_spell_id = 58427;
6849 break;
6850 }
6851 // Unstable Power
6852 case 24658:
6853 {
6854 if (!procSpell || procSpell->Id == 24659)
6855 return false;
6856 // Need remove one 24659 aura
6857 RemoveAuraFromStack(24659);
6858 return true;
6859 }
6860 // Restless Strength
6861 case 24661:
6862 {
6863 // Need remove one 24662 aura
6864 RemoveAuraFromStack(24662);
6865 return true;
6866 }
6867 // Mark of Malice
6868 case 33493:
6869 {
6870 if (triggeredByAura->GetBase()->GetCharges() > 1)
6871 return true;
6872
6873 target = this;
6874 triggered_spell_id = 33494;
6875 break;
6876 }
6877 // Twisted Reflection (boss spell)
6878 case 21063:
6879 triggered_spell_id = 21064;
6880 break;
6881 // Vampiric Aura (boss spell)
6882 case 38196:
6883 {
6884 basepoints0 = 3 * damage; // 300%
6885 if (basepoints0 < 0)
6886 return false;
6887
6888 triggered_spell_id = 31285;
6889 target = this;
6890 break;
6891 }
6892 // Aura of Madness (Darkmoon Card: Madness trinket)
6893 //=====================================================
6894 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6895 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6896 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6897 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6898 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6899 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6900 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6901 // 41011 Martyr Complex: +35 stamina (All classes)
6902 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6903 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6904 case 39446:
6905 {
6906 if (!IsPlayer() || !IsAlive())
6907 return false;
6908
6909 // Select class defined buff
6910 switch (getClass())
6911 {
6912 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6913 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6914 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6915 cooldown_spell_id = 39511;
6916 break;
6917 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6918 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6919 case CLASS_DEATH_KNIGHT:
6920 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6921 cooldown_spell_id = 39511;
6922 break;
6923 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6924 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6925 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6926 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6927 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6928 cooldown_spell_id = 40999;
6929 break;
6930 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6931 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6932 cooldown_spell_id = 40997;
6933 break;
6934 default:
6935 return false;
6936 }
6937
6938 target = this;
6939 if (roll_chance_i(10))
6940 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6941 break;
6942 }
6943 // Sunwell Exalted Caster Neck (??? neck)
6944 // cast ??? Light's Wrath if Exalted by Aldor
6945 // cast ??? Arcane Bolt if Exalted by Scryers
6946 case 46569:
6947 return false; // old unused version
6948 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6949 // cast 45479 Light's Wrath if Exalted by Aldor
6950 // cast 45429 Arcane Bolt if Exalted by Scryers
6951 case 45481:
6952 {
6953 Player* player = ToPlayer();
6954 if (!player)
6955 return false;
6956
6957 // Get Aldor reputation rank
6958 if (player->GetReputationRank(932) == REP_EXALTED)
6959 {
6960 target = this;
6961 triggered_spell_id = 45479;
6962 break;
6963 }
6964 // Get Scryers reputation rank
6965 if (player->GetReputationRank(934) == REP_EXALTED)
6966 {
6967 // triggered at positive/self casts also, current attack target used then
6968 if (target && IsFriendlyTo(target))
6969 {
6970 target = GetVictim();
6971 if (!target)
6972 {
6973 target = player->GetSelectedUnit();
6974 if (!target)
6975 return false;
6976 }
6977 if (IsFriendlyTo(target))
6978 return false;
6979 }
6980
6981 triggered_spell_id = 45429;
6982 break;
6983 }
6984 return false;
6985 }
6986 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6987 // cast 45480 Light's Strength if Exalted by Aldor
6988 // cast 45428 Arcane Strike if Exalted by Scryers
6989 case 45482:
6990 {
6991 if (!IsPlayer())
6992 return false;
6993
6994 // Get Aldor reputation rank
6995 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6996 {
6997 target = this;
6998 triggered_spell_id = 45480;
6999 break;
7000 }
7001 // Get Scryers reputation rank
7002 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
7003 {
7004 triggered_spell_id = 45428;
7005 break;
7006 }
7007 return false;
7008 }
7009 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
7010 // cast 45431 Arcane Insight if Exalted by Aldor
7011 // cast 45432 Light's Ward if Exalted by Scryers
7012 case 45483:
7013 {
7014 if (!IsPlayer())
7015 return false;
7016
7017 // Get Aldor reputation rank
7018 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
7019 {
7020 target = this;
7021 triggered_spell_id = 45432;
7022 break;
7023 }
7024 // Get Scryers reputation rank
7025 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
7026 {
7027 target = this;
7028 triggered_spell_id = 45431;
7029 break;
7030 }
7031 return false;
7032 }
7033 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
7034 // cast 45478 Light's Salvation if Exalted by Aldor
7035 // cast 45430 Arcane Surge if Exalted by Scryers
7036 case 45484:
7037 {
7038 if (!IsPlayer())
7039 return false;
7040
7041 // Get Aldor reputation rank
7042 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
7043 {
7044 target = this;
7045 triggered_spell_id = 45478;
7046 break;
7047 }
7048 // Get Scryers reputation rank
7049 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
7050 {
7051 triggered_spell_id = 45430;
7052 break;
7053 }
7054 return false;
7055 }
7056 // Kill command
7057 case 58914:
7058 {
7059 // Remove aura stack from pet
7060 RemoveAuraFromStack(58914);
7061 Unit* owner = GetOwner();
7062 if (!owner)
7063 return true;
7064 // reduce the owner's aura stack
7065 owner->RemoveAuraFromStack(34027);
7066 return true;
7067 }
7068 // Vampiric Touch (generic, used by some boss)
7069 case 52723:
7070 case 60501:
7071 {
7072 triggered_spell_id = 52724;
7073 basepoints0 = damage / 2;
7074 target = this;
7075 break;
7076 }
7077 // Divine purpose
7078 case 31871:
7079 case 31872:
7080 {
7081 // Roll chane
7082 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
7083 return false;
7084
7085 // Remove any stun effect on target
7087 return true;
7088 }
7089 // Glyph of Life Tap
7090 case 63320:
7091 {
7092 triggered_spell_id = 63321; // Life Tap
7093 break;
7094 }
7095 case 71519: // Deathbringer's Will Normal
7096 {
7097 if (!IsPlayer() || HasSpellCooldown(71484))
7098 return false;
7099
7100 AddSpellCooldown(71484, 0, cooldown);
7101
7102 std::vector<uint32> RandomSpells;
7103 switch (getClass())
7104 {
7105 case CLASS_WARRIOR:
7106 case CLASS_PALADIN:
7107 case CLASS_DEATH_KNIGHT:
7108 RandomSpells.push_back(71484);
7109 RandomSpells.push_back(71491);
7110 RandomSpells.push_back(71492);
7111 break;
7112 case CLASS_SHAMAN:
7113 case CLASS_ROGUE:
7114 RandomSpells.push_back(71486);
7115 RandomSpells.push_back(71485);
7116 RandomSpells.push_back(71492);
7117 break;
7118 case CLASS_DRUID:
7119 RandomSpells.push_back(71484);
7120 RandomSpells.push_back(71485);
7121 RandomSpells.push_back(71492);
7122 break;
7123 case CLASS_HUNTER:
7124 RandomSpells.push_back(71486);
7125 RandomSpells.push_back(71491);
7126 RandomSpells.push_back(71485);
7127 break;
7128 default:
7129 return false;
7130 }
7131 if (RandomSpells.empty()) // shouldn't happen
7132 return false;
7133
7134 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7135 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7136 break;
7137 }
7138 case 71562: // Deathbringer's Will Heroic
7139 {
7140 if (!IsPlayer() || HasSpellCooldown(71561))
7141 return false;
7142
7143 AddSpellCooldown(71561, 0, cooldown);
7144
7145 std::vector<uint32> RandomSpells;
7146 switch (getClass())
7147 {
7148 case CLASS_WARRIOR:
7149 case CLASS_PALADIN:
7150 case CLASS_DEATH_KNIGHT:
7151 RandomSpells.push_back(71561);
7152 RandomSpells.push_back(71559);
7153 RandomSpells.push_back(71560);
7154 break;
7155 case CLASS_SHAMAN:
7156 case CLASS_ROGUE:
7157 RandomSpells.push_back(71558);
7158 RandomSpells.push_back(71556);
7159 RandomSpells.push_back(71560);
7160 break;
7161 case CLASS_DRUID:
7162 RandomSpells.push_back(71561);
7163 RandomSpells.push_back(71556);
7164 RandomSpells.push_back(71560);
7165 break;
7166 case CLASS_HUNTER:
7167 RandomSpells.push_back(71558);
7168 RandomSpells.push_back(71559);
7169 RandomSpells.push_back(71556);
7170 break;
7171 default:
7172 return false;
7173 }
7174 if (RandomSpells.empty()) // shouldn't happen
7175 return false;
7176
7177 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7178 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7179 break;
7180 }
7181 // Freya, Petrified Bark
7182 case 62933:
7183 case 62337:
7184 {
7185 if (!victim)
7186 return false;
7187
7188 int32 dmg = damage;
7189 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7190 return true;
7191 }
7192 // Trial of the Champion, Earth Shield
7193 case 67534:
7194 {
7195 const int32 dmg = (int32)damage;
7196 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7197 return true;
7198 }
7199 // Trial of the Crusader, Faction Champions, Retaliation
7200 case 65932:
7201 {
7202 // check attack comes not from behind
7203 if (!victim || !HasInArc(M_PI, victim))
7204 return false;
7205
7206 triggered_spell_id = 65934;
7207 break;
7208 }
7209 // Pit of Saron, Tyrannus, Overlord's Brand
7210 case 69172: // everything except for DoTs
7211 {
7212 if (!target)
7213 return false;
7214 if (Unit* caster = triggeredByAura->GetCaster())
7215 {
7217 {
7218 int32 dmg = 5.5f * damage;
7219 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7220 }
7221 else
7222 {
7223 if (caster->GetVictim())
7224 {
7225 int32 dmg = damage;
7226 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7227 }
7228 }
7229 }
7230 return true;
7231 }
7232 // Pit of Saron, Tyrannus, Overlord's Brand
7233 case 69173: // only DoTs
7234 {
7235 if (!target)
7236 return false;
7237 if (Unit* caster = triggeredByAura->GetCaster())
7238 {
7239 if (procEx & PROC_EX_INTERNAL_HOT)
7240 {
7241 int32 dmg = 5.5f * damage;
7242 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7243 }
7244 else
7245 {
7246 if (caster->GetVictim())
7247 {
7248 int32 dmg = damage;
7249 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7250 }
7251 }
7252 }
7253 return true;
7254 }
7255 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7256 case 70674:
7257 {
7258 if (Unit* caster = triggeredByAura->GetCaster())
7259 {
7260 int32 dmg = 3 * damage;
7261 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7262 }
7263 return true;
7264 }
7265 // Item: Purified Shard of the Gods
7266 case 69755:
7267 {
7268 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7269 break;
7270 }
7271 // Item: Shiny Shard of the Gods
7272 case 69739:
7273 {
7274 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7275 break;
7276 }
7277 // VoA: Meteor Fists koralon
7278 case 66725:
7279 case 68161:
7280 {
7281 triggered_spell_id = 66765; // handled by spell_difficulty
7282 break;
7283 }
7284 }
7285 break;
7286 }
7287 case SPELLFAMILY_MAGE:
7288 {
7289 // Magic Absorption
7290 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7291 {
7293 return false;
7294
7295 // mana reward
7296 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7297 target = this;
7298 triggered_spell_id = 29442;
7299 break;
7300 }
7301 // Hot Streak
7302 if (dummySpell->SpellIconID == 2999)
7303 {
7304 if (effIndex != 0)
7305 return false;
7306 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7307 if (!counter)
7308 return true;
7309
7310 // Count spell criticals in a row in second aura
7311 if (procEx & PROC_EX_CRITICAL_HIT)
7312 {
7313 counter->SetAmount(counter->GetAmount() * 2);
7314 if (counter->GetAmount() < 100) // not enough
7315 return true;
7316 // Crititcal counted -> roll chance
7317 if (roll_chance_i(triggerAmount))
7318 CastSpell(this, 48108, true, castItem, triggeredByAura);
7319 }
7320 counter->SetAmount(25);
7321 return true;
7322 }
7323 // Incanter's Regalia set (add trigger chance to Mana Shield)
7324 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7325 {
7326 if (!IsPlayer())
7327 return false;
7328
7329 target = this;
7330 triggered_spell_id = 37436;
7331 break;
7332 }
7333 switch (dummySpell->Id)
7334 {
7335 // Glyph of Polymorph
7336 case 56375:
7337 {
7338 if (!target)
7339 return false;
7340 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7343 return true;
7344 }
7345 // Glyph of Icy Veins
7346 case 56374:
7347 {
7350 return true;
7351 }
7352 // Glyph of Ice Block
7353 case 56372:
7354 {
7355 Player* player = ToPlayer();
7356 if (!player)
7357 return false;
7358
7359 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7360 // remove cooldowns on all ranks of Frost Nova
7361 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7362 {
7363 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7364 // Frost Nova
7365 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7366 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7367 player->RemoveSpellCooldown(cdSpell->Id, true);
7368 }
7369 break;
7370 }
7371 }
7372 break;
7373 }
7375 {
7376 // Second Wind
7377 if (dummySpell->SpellIconID == 1697)
7378 {
7379 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7380 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7381 return false;
7382 // Need stun or root mechanic
7383 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7384 return false;
7385
7386 switch (dummySpell->Id)
7387 {
7388 case 29838:
7389 triggered_spell_id = 29842;
7390 break;
7391 case 29834:
7392 triggered_spell_id = 29841;
7393 break;
7394 case 42770:
7395 triggered_spell_id = 42771;
7396 break;
7397 default:
7398 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7399 return false;
7400 }
7401
7402 target = this;
7403 break;
7404 }
7405 break;
7406 }
7408 {
7409 switch (dummySpell->Id)
7410 {
7411 // Nightfall
7412 case 18094:
7413 case 18095:
7414 // Glyph of corruption
7415 case 56218:
7416 {
7417 target = this;
7418 triggered_spell_id = 17941;
7419 break;
7420 }
7421 // Soul Leech
7422 case 30293:
7423 case 30295:
7424 case 30296:
7425 {
7426 // Improved Soul Leech
7427 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7428 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7429 {
7430 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7431 {
7432 if ((*i)->GetEffIndex() != 0)
7433 continue;
7434 basepoints0 = int32((*i)->GetAmount());
7435 target = GetGuardianPet();
7436 if (target)
7437 {
7438 // regen mana for pet
7439 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7440 }
7441 // regen mana for caster
7442 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7443 // Get second aura of spell for replenishment effect on party
7444 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7445 {
7446 // Replenishment - roll chance
7447 if (roll_chance_i(aurEff->GetAmount()))
7448 {
7449 CastSpell(this, 57669, true, castItem, triggeredByAura);
7450 }
7451 }
7452 break;
7453 }
7454 }
7455 // health
7456 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7457 target = this;
7458 triggered_spell_id = 30294;
7459 break;
7460 }
7461 // Shadowflame (Voidheart Raiment set bonus)
7462 case 37377:
7463 {
7464 triggered_spell_id = 37379;
7465 break;
7466 }
7467 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7468 case 37381:
7469 {
7470 target = GetGuardianPet();
7471 if (!target)
7472 return false;
7473
7474 // heal amount
7475 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7476 triggered_spell_id = 37382;
7477 break;
7478 }
7479 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7480 case 39437:
7481 {
7482 triggered_spell_id = 37378;
7483 break;
7484 }
7485 }
7486 break;
7487 }
7488 case SPELLFAMILY_PRIEST:
7489 {
7490 // Body and Soul
7491 if (dummySpell->SpellIconID == 2218)
7492 {
7493 // Proc only from Abolish desease on self cast
7494 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7495 return false;
7496 triggered_spell_id = 64136;
7497 target = this;
7498 break;
7499 }
7500 switch (dummySpell->Id)
7501 {
7502 // Vampiric Embrace
7503 case 15286:
7504 {
7505 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7506 return false;
7507
7508 // heal amount
7509 int32 total = CalculatePct(int32(damage), triggerAmount);
7510 int32 team = total / 5;
7511 int32 self = total - team;
7512 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7513 return true; // no hidden cooldown
7514 }
7515 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7516 case 40438:
7517 {
7518 // Shadow Word: Pain
7519 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7520 triggered_spell_id = 40441;
7521 // Renew
7522 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7523 triggered_spell_id = 40440;
7524 else
7525 return false;
7526
7527 target = this;
7528 break;
7529 }
7530 // Improved Shadowform
7531 case 47570:
7532 case 47569:
7533 {
7534 if (!roll_chance_i(triggerAmount))
7535 return false;
7536
7538 break;
7539 }
7540 // Glyph of Dispel Magic
7541 case 55677:
7542 {
7543 // Dispel Magic shares spellfamilyflag with abolish disease
7544 if (procSpell->SpellIconID != 74)
7545 return false;
7546 if (!target || !target->IsFriendlyTo(this))
7547 return false;
7548
7549 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7550 triggered_spell_id = 56131;
7551 break;
7552 }
7553 // Oracle Healing Bonus ("Garments of the Oracle" set)
7554 case 26169:
7555 {
7556 // heal amount
7557 basepoints0 = int32(CalculatePct(damage, 10));
7558 target = this;
7559 triggered_spell_id = 26170;
7560 break;
7561 }
7562 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7563 case 39372:
7564 {
7565 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7566 return false;
7567
7568 // heal amount
7569 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7570 target = this;
7571 triggered_spell_id = 39373;
7572 break;
7573 }
7574 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7575 case 28809:
7576 {
7577 triggered_spell_id = 28810;
7578 break;
7579 }
7580 // Priest T10 Healer 2P Bonus
7581 case 70770:
7582 // Flash Heal
7583 if (procSpell->SpellFamilyFlags[0] & 0x800)
7584 {
7585 triggered_spell_id = 70772;
7586 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7587 if (!blessHealing || !victim)
7588 return false;
7589 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7590 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7591 return true;
7592 }
7593 break;
7594 }
7595 break;
7596 }
7597 case SPELLFAMILY_DRUID:
7598 {
7599 switch (dummySpell->Id)
7600 {
7601 // Glyph of Innervate
7602 case 54832:
7603 {
7604 if (procSpell->SpellIconID != 62)
7605 return false;
7606
7607 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7608 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7609 triggered_spell_id = 54833;
7610 target = this;
7611 break;
7612 }
7613 // Glyph of Starfire
7614 case 54845:
7615 {
7616 triggered_spell_id = 54846;
7617 break;
7618 }
7619 // Glyph of Shred
7620 case 54815:
7621 {
7622 if (!target)
7623 return false;
7624
7625 // try to find spell Rip on the target
7626 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7627 {
7628 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7629 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7630
7631 // just Rip's max duration without other spells
7632 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7633
7634 // add possible auras' and Glyph of Shred's max duration
7635 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7636 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7637 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7638
7639 // if min < max -> that means caster didn't cast 3 shred yet
7640 // so set Rip's duration and max duration
7641 if (CountMin < CountMax)
7642 {
7643 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7644 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7645 return true;
7646 }
7647 }
7648 // if not found Rip
7649 return false;
7650 }
7651 // Glyph of Rake
7652 case 54821:
7653 {
7654 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7655 {
7656 if (target && target->IsCreature())
7657 {
7658 triggered_spell_id = 54820;
7659 break;
7660 }
7661 }
7662 return false;
7663 }
7664 // Leader of the Pack
7665 case 24932:
7666 {
7667 if (triggerAmount <= 0)
7668 return false;
7669 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7670 target = this;
7671 triggered_spell_id = 34299;
7672 if (triggeredByAura->GetCasterGUID() != GetGUID())
7673 break;
7674 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7675 // Improved Leader of the Pack
7676 // Check cooldown of heal spell cooldown
7677 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7678 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7679 break;
7680 }
7681 // Healing Touch (Dreamwalker Raiment set)
7682 case 28719:
7683 {
7684 // mana back
7685 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7686 target = this;
7687 triggered_spell_id = 28742;
7688 break;
7689 }
7690 // Glyph of Rejuvenation
7691 case 54754:
7692 {
7693 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7694 return false;
7695 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7696 triggered_spell_id = 54755;
7697 break;
7698 }
7699 // Healing Touch Refund (Idol of Longevity trinket)
7700 case 28847:
7701 {
7702 target = this;
7703 triggered_spell_id = 28848;
7704 break;
7705 }
7706 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7707 case 37288:
7708 case 37295:
7709 {
7710 target = this;
7711 triggered_spell_id = 37238;
7712 break;
7713 }
7714 // Druid Tier 6 Trinket
7715 case 40442:
7716 {
7717 float chance;
7718
7719 // Starfire
7720 if (procSpell->SpellFamilyFlags[0] & 0x4)
7721 {
7722 triggered_spell_id = 40445;
7723 chance = 25.0f;
7724 }
7725 // Rejuvenation
7726 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7727 {
7728 triggered_spell_id = 40446;
7729 chance = 25.0f;
7730 }
7731 // Mangle (Bear) and Mangle (Cat)
7732 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7733 {
7734 triggered_spell_id = 40452;
7735 chance = 40.0f;
7736 }
7737 else
7738 return false;
7739
7740 if (!roll_chance_f(chance))
7741 return false;
7742
7743 target = this;
7744 break;
7745 }
7746 // Maim Interrupt
7747 case 44835:
7748 {
7749 // Deadly Interrupt Effect
7750 triggered_spell_id = 32747;
7751 break;
7752 }
7753 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7754 case 70664:
7755 {
7756 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7757 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7758 return false;
7759
7760 Player* caster = ToPlayer();
7761 if (!caster)
7762 return false;
7763 if (!caster->GetGroup() && victim == this)
7764 return false;
7765
7766 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7767 return true;
7768 }
7769 }
7770 // Eclipse
7771 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7772 {
7773 if (!procSpell || effIndex != 0)
7774 return false;
7775
7776 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7777
7778 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7779 return false;
7780
7781 target = this;
7782 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7783 return false;
7784
7785 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7786 break;
7787 }
7788 [[fallthrough]];
7789 }
7790 case SPELLFAMILY_ROGUE:
7791 {
7792 switch (dummySpell->Id)
7793 {
7794 // Glyph of Backstab
7795 case 56800:
7796 {
7797 if (victim)
7798 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7799 if (Aura* aur = aurEff->GetBase())
7800 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7801 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7802 {
7803 aur->SetDuration(aur->GetDuration() + 2000);
7804 return true;
7805 }
7806 return false;
7807 }
7808 // Deadly Throw Interrupt
7809 case 32748:
7810 {
7811 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7812 if (this == victim)
7813 return false;
7814
7815 triggered_spell_id = 32747;
7816 break;
7817 }
7818 }
7819 // Master of subtlety
7820 if (dummySpell->SpellIconID == 2114)
7821 {
7822 triggered_spell_id = 31665;
7823 basepoints0 = triggerAmount;
7824 break;
7825 }
7826 // Cut to the Chase
7827 if (dummySpell->SpellIconID == 2909)
7828 {
7829 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7830 // lookup Slice and Dice
7831 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7832 {
7833 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7834 return true;
7835 }
7836 return false;
7837 }
7838 // Deadly Brew
7839 else if (dummySpell->SpellIconID == 2963)
7840 {
7841 triggered_spell_id = 3409;
7842 break;
7843 }
7844 // Quick Recovery
7845 else if (dummySpell->SpellIconID == 2116)
7846 {
7847 if (!procSpell)
7848 return false;
7849
7850 // energy cost save
7851 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7852 if (basepoints0 <= 0)
7853 return false;
7854
7855 target = this;
7856 triggered_spell_id = 31663;
7857 break;
7858 }
7859 break;
7860 }
7861 case SPELLFAMILY_HUNTER:
7862 {
7863 switch (dummySpell->SpellIconID)
7864 {
7865 case 2236: // Thrill of the Hunt
7866 {
7867 if (!procSpell)
7868 return false;
7869
7871
7872 // Disable charge drop because of Lock and Load
7873 if (spell)
7874 ToPlayer()->SetSpellModTakingSpell(spell, false);
7875
7876 // Explosive Shot
7877 if (procSpell->SpellFamilyFlags[2] & 0x200)
7878 {
7879 if (!victim)
7880 return false;
7881 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7882 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7883 }
7884 else
7885 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7886
7887 if (spell)
7888 ToPlayer()->SetSpellModTakingSpell(spell, true);
7889
7890 if (basepoints0 <= 0)
7891 return false;
7892
7893 target = this;
7894 triggered_spell_id = 34720;
7895 break;
7896 }
7897 case 3406: // Hunting Party
7898 {
7899 triggered_spell_id = 57669;
7900 target = this;
7901 break;
7902 }
7903 case 3560: // Rapid Recuperation
7904 {
7905 // This effect only from Rapid Killing (mana regen)
7906 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7907 return false;
7908
7909 target = this;
7910
7911 switch (dummySpell->Id)
7912 {
7913 case 53228: // Rank 1
7914 triggered_spell_id = 56654;
7915 break;
7916 case 53232: // Rank 2
7917 triggered_spell_id = 58882;
7918 break;
7919 }
7920 break;
7921 }
7922 }
7923
7924 switch (dummySpell->Id)
7925 {
7926 case 57870: // Glyph of Mend Pet
7927 {
7928 if (!victim)
7929 return false;
7930
7931 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7932 return true;
7933 }
7934 }
7935 break;
7936 }
7938 {
7939 // Light's Beacon - Beacon of Light
7940 if (dummySpell->Id == 53651)
7941 {
7942 if (!victim)
7943 return false;
7944
7945 // Do not proc from Glyph of Holy Light and Judgement of Light
7946 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7947 {
7948 return false;
7949 }
7950
7951 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7952 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7953 return false;
7954
7955 basepoints0 = int32(damage);
7956 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7957
7958 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7959 return true;
7960 }
7961 // Judgements of the Wise
7962 if (dummySpell->SpellIconID == 3017)
7963 {
7964 target = this;
7965 triggered_spell_id = 31930;
7966 // replenishment
7967 CastSpell(this, 57669, true, castItem, triggeredByAura);
7968 break;
7969 }
7970 // Righteous Vengeance
7971 if (dummySpell->SpellIconID == 3025)
7972 {
7973 if (!victim)
7974 return false;
7975
7976 // 4 damage tick
7977 basepoints0 = triggerAmount * damage / 400;
7978 triggered_spell_id = 61840;
7979 // Add remaining ticks to damage done
7980 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7981 return true;
7982 }
7983 // Sheath of Light
7984 if (dummySpell->SpellIconID == 3030)
7985 {
7986 // 4 healing tick
7987 basepoints0 = triggerAmount * damage / 400;
7988 triggered_spell_id = 54203;
7989 break;
7990 }
7991 switch (dummySpell->Id)
7992 {
7993 // Judgement of Light
7994 case 20185:
7995 {
7996 if (!victim || !victim->IsAlive())
7997 return false;
7998
7999 auto* caster = triggeredByAura->GetBase()->GetCaster();
8000 if (!caster || !victim->IsFriendlyTo(caster))
8001 return false;
8002
8003 // 2% of base health
8004 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
8005 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
8006 return true;
8007 }
8008 // Judgement of Wisdom
8009 case 20186:
8010 {
8011 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
8012 return false;
8013
8014 auto* caster = triggeredByAura->GetBase()->GetCaster();
8015 if (!caster || !victim->IsFriendlyTo(caster))
8016 return false;
8017
8018 // 2% of base mana
8019 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
8020 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
8021 return true;
8022 }
8023 // Holy Power (Redemption Armor set)
8024 case 28789:
8025 {
8026 if (!victim)
8027 return false;
8028
8029 // Set class defined buff
8030 switch (victim->getClass())
8031 {
8032 case CLASS_PALADIN:
8033 case CLASS_PRIEST:
8034 case CLASS_SHAMAN:
8035 case CLASS_DRUID:
8036 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8037 break;
8038 case CLASS_MAGE:
8039 case CLASS_WARLOCK:
8040 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8041 break;
8042 case CLASS_HUNTER:
8043 case CLASS_ROGUE:
8044 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
8045 break;
8046 case CLASS_WARRIOR:
8047 triggered_spell_id = 28790; // Increases the friendly target's armor
8048 break;
8049 default:
8050 return false;
8051 }
8052 break;
8053 }
8054 // Seal of Vengeance (damage calc on apply aura)
8055 case 31801:
8056 {
8057 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
8058 return false;
8059
8060 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
8061 bool stacker = !procSpell || procSpell->Id == 53595;
8062 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
8063 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
8064
8065 if (!stacker && !damager)
8066 return false;
8067
8068 triggered_spell_id = 31803;
8069
8070 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
8071 {
8072 if (aur->GetStackAmount() == 5)
8073 {
8074 if (stacker)
8075 aur->RefreshDuration();
8076 }
8077 }
8078
8079 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
8080
8081 if (!stacker)
8082 return false;
8083 break;
8084 }
8085 // Seal of Corruption
8086 case 53736:
8087 {
8088 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
8089 return false;
8090
8091 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
8092 bool stacker = !procSpell || procSpell->Id == 53595;
8093 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
8094 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
8095
8096 if (!stacker && !damager)
8097 return false;
8098
8099 triggered_spell_id = 53742;
8100
8101 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
8102 {
8103 if (aur->GetStackAmount() == 5)
8104 {
8105 if (stacker)
8106 aur->RefreshDuration();
8107 }
8108 }
8109
8110 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
8111
8112 if (!stacker)
8113 return false;
8114 break;
8115 }
8116 // Spiritual Attunement
8117 case 31785:
8118 case 33776:
8119 {
8120 // if healed by another unit (victim)
8121 if (this == victim)
8122 return false;
8123
8124 // dont allow non-positive dots to proc
8125 if (!procSpell || !procSpell->IsPositive())
8126 return false;
8127
8128 HealInfo const* healInfo = eventInfo.GetHealInfo();
8129 if (!healInfo)
8130 {
8131 return false;
8132 }
8133
8134 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
8135 if (effectiveHeal)
8136 {
8137 // heal amount
8138 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
8139 target = this;
8140
8141 if (basepoints0)
8142 triggered_spell_id = 31786;
8143 }
8144 break;
8145 }
8146 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8147 case 40470:
8148 {
8149 if (!procSpell)
8150 return false;
8151
8152 float chance = 0.0f;
8153
8154 // Flash of light/Holy light
8155 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8156 {
8157 triggered_spell_id = 40471;
8158 chance = 15.0f;
8159 }
8160 // Judgement (any)
8161 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8162 {
8163 triggered_spell_id = 40472;
8164 chance = 50.0f;
8165 }
8166 else
8167 return false;
8168
8169 if (!roll_chance_f(chance))
8170 return false;
8171
8172 break;
8173 }
8174 // Glyph of Holy Light
8175 case 54937:
8176 {
8177 triggered_spell_id = 54968;
8178 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8179 break;
8180 }
8181 // Item - Paladin T8 Holy 2P Bonus
8182 case 64890:
8183 {
8184 triggered_spell_id = 64891;
8185 basepoints0 = triggerAmount * damage / 300;
8186 break;
8187 }
8188 case 71406: // Tiny Abomination in a Jar
8189 case 71545: // Tiny Abomination in a Jar (Heroic)
8190 {
8191 if (!victim || !victim->IsAlive())
8192 return false;
8193
8194 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8195
8196 Aura const* dummy = GetAura(71432);
8197 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8198 return false;
8199
8200 RemoveAurasDueToSpell(71432);
8201 triggered_spell_id = 71433; // default main hand attack
8202 // roll if offhand
8203 if (Player const* player = ToPlayer())
8204 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8205 triggered_spell_id = 71434;
8206 target = victim;
8207 break;
8208 }
8209 // Item - Icecrown 25 Normal Dagger Proc
8210 case 71880:
8211 {
8212 switch (getPowerType())
8213 {
8214 case POWER_MANA:
8215 triggered_spell_id = 71881;
8216 break;
8217 case POWER_RAGE:
8218 triggered_spell_id = 71883;
8219 break;
8220 case POWER_ENERGY:
8221 triggered_spell_id = 71882;
8222 break;
8223 case POWER_RUNIC_POWER:
8224 triggered_spell_id = 71884;
8225 break;
8226 default:
8227 return false;
8228 }
8229 break;
8230 }
8231 // Item - Icecrown 25 Heroic Dagger Proc
8232 case 71892:
8233 {
8234 switch (getPowerType())
8235 {
8236 case POWER_MANA:
8237 triggered_spell_id = 71888;
8238 break;
8239 case POWER_RAGE:
8240 triggered_spell_id = 71886;
8241 break;
8242 case POWER_ENERGY:
8243 triggered_spell_id = 71887;
8244 break;
8245 case POWER_RUNIC_POWER:
8246 triggered_spell_id = 71885;
8247 break;
8248 default:
8249 return false;
8250 }
8251 break;
8252 }
8253 }
8254 break;
8255 }
8256 case SPELLFAMILY_SHAMAN:
8257 {
8258 switch (dummySpell->Id)
8259 {
8260 // Tidal Force
8261 case 55198:
8262 {
8263 // Remove aura stack from caster
8264 RemoveAuraFromStack(55166);
8265 // drop charges
8266 return false;
8267 }
8268 // Totemic Power (The Earthshatterer set)
8269 case 28823:
8270 {
8271 if (!victim)
8272 return false;
8273
8274 // Set class defined buff
8275 switch (victim->getClass())
8276 {
8277 case CLASS_PALADIN:
8278 case CLASS_PRIEST:
8279 case CLASS_SHAMAN:
8280 case CLASS_DRUID:
8281 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8282 break;
8283 case CLASS_MAGE:
8284 case CLASS_WARLOCK:
8285 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8286 break;
8287 case CLASS_HUNTER:
8288 case CLASS_ROGUE:
8289 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8290 break;
8291 case CLASS_WARRIOR:
8292 triggered_spell_id = 28827; // Increases the friendly target's armor
8293 break;
8294 default:
8295 return false;
8296 }
8297 break;
8298 }
8299 // Lesser Healing Wave (Totem of Flowing Water Relic)
8300 case 28849:
8301 {
8302 target = this;
8303 triggered_spell_id = 28850;
8304 break;
8305 }
8306 // Windfury Weapon (Passive) 1-8 Ranks
8307 case 33757:
8308 {
8309 Player* player = ToPlayer();
8310 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8311 return false;
8312
8313 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8314 return false;
8315
8316 WeaponAttackType attType = player->GetAttackBySlot(castItem->GetSlot());
8317 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8318 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8319 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8320 return false;
8321
8322 // Now amount of extra power stored in 1 effect of Enchant spell
8323 // Get it by item enchant id
8324 uint32 spellId;
8326 {
8327 case 283:
8328 spellId = 8232;
8329 break; // 1 Rank
8330 case 284:
8331 spellId = 8235;
8332 break; // 2 Rank
8333 case 525:
8334 spellId = 10486;
8335 break; // 3 Rank
8336 case 1669:
8337 spellId = 16362;
8338 break; // 4 Rank
8339 case 2636:
8340 spellId = 25505;
8341 break; // 5 Rank
8342 case 3785:
8343 spellId = 58801;
8344 break; // 6 Rank
8345 case 3786:
8346 spellId = 58803;
8347 break; // 7 Rank
8348 case 3787:
8349 spellId = 58804;
8350 break; // 8 Rank
8351 default:
8352 {
8353 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8354 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8355 return false;
8356 }
8357 }
8358
8359 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8360 if (!windfurySpellInfo)
8361 {
8362 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8363 return false;
8364 }
8365
8366 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8367
8368 // Value gained from additional AP
8369 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8370
8371 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8372 triggered_spell_id = 25504;
8373
8374 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8375 triggered_spell_id = 33750;
8376
8377 // custom cooldown processing case
8378 if (player->HasSpellCooldown(dummySpell->Id))
8379 return false;
8380
8381 // apply cooldown before cast to prevent processing itself
8382 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8383
8384 // Attack Twice
8385 for (uint32 i = 0; i < 2; ++i)
8386 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8387
8388 return true;
8389 }
8390 // Shaman Tier 6 Trinket
8391 case 40463:
8392 {
8393 if (!procSpell)
8394 return false;
8395
8396 float chance;
8397 if (procSpell->SpellFamilyFlags[0] & 0x1)
8398 {
8399 triggered_spell_id = 40465; // Lightning Bolt
8400 chance = 15.0f;
8401 }
8402 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8403 {
8404 triggered_spell_id = 40465; // Lesser Healing Wave
8405 chance = 10.0f;
8406 }
8407 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8408 {
8409 triggered_spell_id = 40466; // Stormstrike
8410 chance = 50.0f;
8411 }
8412 else
8413 return false;
8414
8415 if (!roll_chance_f(chance))
8416 return false;
8417
8418 target = this;
8419 break;
8420 }
8421 // Glyph of Healing Wave
8422 case 55440:
8423 {
8424 // Not proc from self heals
8425 if (this == victim)
8426 return false;
8427 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8428 target = this;
8429 triggered_spell_id = 55533;
8430 break;
8431 }
8432 // Spirit Hunt
8433 case 58877:
8434 {
8435 // Cast on owner
8436 target = GetOwner();
8437 if (!target)
8438 return false;
8439 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8440 triggered_spell_id = 58879;
8441 // Heal wolf
8442 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8443 break;
8444 }
8445 // Shaman T9 Elemental 4P Bonus
8446 case 67228:
8447 {
8448 // Lava Burst
8449 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8450 {
8451 triggered_spell_id = 71824;
8452 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8453 if (!triggeredSpell)
8454 return false;
8455 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8456 }
8457 break;
8458 }
8459 // Item - Shaman T10 Elemental 4P Bonus
8460 case 70817:
8461 {
8462 if (!target)
8463 return false;
8464 // try to find spell Flame Shock on the target
8465 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8466 {
8467 Aura* flameShock = aurEff->GetBase();
8468 int32 extraTime = 2 * aurEff->GetAmplitude();
8469 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8470 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8471
8472 return true;
8473 }
8474 // if not found Flame Shock
8475 return false;
8476 }
8477 break;
8478 }
8479 // Frozen Power
8480 if (dummySpell->SpellIconID == 3780)
8481 {
8482 if (!target)
8483 return false;
8484 if (GetDistance(target) < 15.0f)
8485 return false;
8486 float chance = (float)triggerAmount;
8487 if (!roll_chance_f(chance))
8488 return false;
8489
8490 triggered_spell_id = 63685;
8491 break;
8492 }
8493 // Ancestral Awakening
8494 if (dummySpell->SpellIconID == 3065)
8495 {
8496 triggered_spell_id = 52759;
8497 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8498 target = this;
8499 break;
8500 }
8501 // Flametongue Weapon (Passive)
8502 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8503 {
8504 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8505 return false;
8506
8507 WeaponAttackType attType = Player::GetAttackBySlot(castItem->GetSlot());
8508 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8509 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8510 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8511 return false;
8512
8513 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8514
8515 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8517
8518 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8519 ApplyPct(add_spellpower, 3.84f);
8520
8521 // Enchant on Off-Hand and ready?
8522 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8523 {
8524 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8525
8526 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8527 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8528 triggered_spell_id = 10444;
8529 }
8530
8531 // Enchant on Main-Hand and ready?
8532 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8533 {
8534 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8535
8536 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8537 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8538 triggered_spell_id = 10444;
8539 }
8540
8541 // If not ready, we should return, shouldn't we?!
8542 else
8543 return false;
8544
8545 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8546 return true;
8547 }
8548 // Improved Water Shield
8549 if (dummySpell->SpellIconID == 2287)
8550 {
8551 if (!procSpell)
8552 return false;
8553
8554 // Default chance for Healing Wave and Riptide
8555 float chance = (float)triggeredByAura->GetAmount();
8556
8557 if (procSpell->SpellFamilyFlags[0] & 0x80)
8558 // Lesser Healing Wave - 0.6 of default
8559 chance *= 0.6f;
8560 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8561 // Chain heal - 0.3 of default
8562 chance *= 0.3f;
8563
8564 if (!roll_chance_f(chance))
8565 return false;
8566
8567 // Water Shield
8568 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8569 {
8570 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8571 CastSpell(this, spell, true, castItem, triggeredByAura);
8572 return true;
8573 }
8574 return false;
8575 }
8576 // Lightning Overload
8577 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8578 {
8579 if (!procSpell || !IsPlayer() || !victim)
8580 return false;
8581
8582 uint32 spell = 45284;
8583
8584 // chain lightning only procs 1/3 of the time
8585 if (procSpell->SpellFamilyFlags[0] & 0x2)
8586 {
8587 if (!roll_chance_i(33))
8588 return false;
8589 spell = 45297;
8590 }
8591
8592 if (procEx & PROC_EX_CRITICAL_HIT)
8593 damage /= 2;
8594
8595 // do not reduce damage-spells have correct basepoints
8596 damage /= 2;
8597 int32 dmg = damage;
8598
8599 // Cast
8600 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8601 return true;
8602 }
8603 // Static Shock
8604 if (dummySpell->SpellIconID == 3059)
8605 {
8606 // Lightning Shield
8608 {
8609 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8610 CastSpell(target, spell, true, castItem, triggeredByAura);
8611 aurEff->GetBase()->DropCharge();
8612 return true;
8613 }
8614 return false;
8615 }
8616 break;
8617 }
8619 {
8620 // Improved Blood Presence
8621 if (dummySpell->SpellIconID == 2636)
8622 {
8623 if (!IsPlayer())
8624 return false;
8625 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8626 break;
8627 }
8628 // Butchery
8629 if (dummySpell->SpellIconID == 2664)
8630 {
8631 basepoints0 = triggerAmount;
8632 triggered_spell_id = 50163;
8633 target = this;
8634 break;
8635 }
8636 // Mark of Blood
8637 if (dummySpell->Id == 49005)
8638 {
8640 triggered_spell_id = 61607;
8641 break;
8642 }
8643 // Unholy Blight
8644 if (dummySpell->Id == 49194)
8645 {
8646 triggered_spell_id = 50536;
8647 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8648 if (!unholyBlight || !victim)
8649 return false;
8650
8651 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8652
8653 //Glyph of Unholy Blight
8654 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8655 AddPct(basepoints0, glyph->GetAmount());
8656
8657 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8658 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8659 return true;
8660 }
8661 // Vendetta
8662 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8663 {
8664 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8665 triggered_spell_id = 50181;
8666 target = this;
8667 break;
8668 }
8669 // Necrosis
8670 if (dummySpell->SpellIconID == 2709)
8671 {
8672 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8673 triggered_spell_id = 51460;
8674 break;
8675 }
8676 // Threat of Thassarian
8677 if (dummySpell->SpellIconID == 2023)
8678 {
8679 // Must Dual Wield
8680 if (!procSpell || !HasOffhandWeaponForAttack())
8681 return false;
8682 // Chance as basepoints for dummy aura
8683 if (!roll_chance_i(triggerAmount))
8684 return false;
8685
8686 switch (procSpell->Id)
8687 {
8688 // Obliterate
8689 case 49020:
8690 triggered_spell_id = 66198;
8691 break; // Rank 1
8692 case 51423:
8693 triggered_spell_id = 66972;
8694 break; // Rank 2
8695 case 51424:
8696 triggered_spell_id = 66973;
8697 break; // Rank 3
8698 case 51425:
8699 triggered_spell_id = 66974;
8700 break; // Rank 4
8701
8702 // Frost Strike
8703 case 49143:
8704 triggered_spell_id = 66196;
8705 break; // Rank 1
8706 case 51416:
8707 triggered_spell_id = 66958;
8708 break; // Rank 2
8709 case 51417:
8710 triggered_spell_id = 66959;
8711 break; // Rank 3
8712 case 51418:
8713 triggered_spell_id = 66960;
8714 break; // Rank 4
8715 case 51419:
8716 triggered_spell_id = 66961;
8717 break; // Rank 5
8718 case 55268:
8719 triggered_spell_id = 66962;
8720 break; // Rank 6
8721
8722 // Plague Strike
8723 case 45462:
8724 triggered_spell_id = 66216;
8725 break; // Rank 1
8726 case 49917:
8727 triggered_spell_id = 66988;
8728 break; // Rank 2
8729 case 49918:
8730 triggered_spell_id = 66989;
8731 break; // Rank 3
8732 case 49919:
8733 triggered_spell_id = 66990;
8734 break; // Rank 4
8735 case 49920:
8736 triggered_spell_id = 66991;
8737 break; // Rank 5
8738 case 49921:
8739 triggered_spell_id = 66992;
8740 break; // Rank 6
8741
8742 // Death Strike
8743 case 49998:
8744 triggered_spell_id = 66188;
8745 break; // Rank 1
8746 case 49999:
8747 triggered_spell_id = 66950;
8748 break; // Rank 2
8749 case 45463:
8750 triggered_spell_id = 66951;
8751 break; // Rank 3
8752 case 49923:
8753 triggered_spell_id = 66952;
8754 break; // Rank 4
8755 case 49924:
8756 triggered_spell_id = 66953;
8757 break; // Rank 5
8758
8759 // Rune Strike
8760 case 56815:
8761 triggered_spell_id = 66217;
8762 break; // Rank 1
8763
8764 // Blood Strike
8765 case 45902:
8766 triggered_spell_id = 66215;
8767 break; // Rank 1
8768 case 49926:
8769 triggered_spell_id = 66975;
8770 break; // Rank 2
8771 case 49927:
8772 triggered_spell_id = 66976;
8773 break; // Rank 3
8774 case 49928:
8775 triggered_spell_id = 66977;
8776 break; // Rank 4
8777 case 49929:
8778 triggered_spell_id = 66978;
8779 break; // Rank 5
8780 case 49930:
8781 triggered_spell_id = 66979;
8782 break; // Rank 6
8783 default:
8784 return false;
8785 }
8786
8787 // This should do, restore spell mod so next attack can also use this!
8788 // crit chance for first strike is already computed
8789 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8790 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8791
8792 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8793 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8794 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8795 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8796
8797 SetCantProc(true);
8798 if (basepoints0)
8799 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8800 else
8801 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8802 SetCantProc(false);
8803 return true;
8804 }
8805 // Runic Power Back on Snare/Root
8806 if (dummySpell->Id == 61257)
8807 {
8808 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8809 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8810 return false;
8811 // Need snare or root mechanic
8812 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8813 return false;
8814 triggered_spell_id = 61258;
8815 target = this;
8816 break;
8817 }
8818 // Sudden Doom
8819 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8820 {
8821 SpellChainNode const* chain = nullptr;
8822 // get highest rank of the Death Coil spell
8823 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8824 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8825 {
8826 // check if shown in spell book
8827 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8828 continue;
8829
8830 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8831 if (!spellProto)
8832 continue;
8833
8834 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8835 && spellProto->SpellFamilyFlags[0] & 0x2000)
8836 {
8837 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8838
8839 // No chain entry or entry lower than found entry
8840 if (!chain || !newChain || (chain->rank < newChain->rank))
8841 {
8842 triggered_spell_id = itr->first;
8843 chain = newChain;
8844 }
8845 else
8846 continue;
8847 // Found spell is last in chain - do not need to look more
8848 // Optimisation for most common case
8849 if (chain && chain->last->Id == itr->first)
8850 break;
8851 }
8852 }
8853 }
8854 break;
8855 }
8856 case SPELLFAMILY_POTION:
8857 {
8858 // alchemist's stone
8859 if (dummySpell->Id == 17619)
8860 {
8861 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8862 {
8863 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8864 {
8865 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8866 {
8867 triggered_spell_id = 21399;
8868 }
8869 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8870 {
8871 triggered_spell_id = 21400;
8872 }
8873 else
8874 continue;
8875
8876 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8877 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8878 }
8879 return true;
8880 }
8881 }
8882 break;
8883 }
8884 case SPELLFAMILY_PET:
8885 {
8886 switch (dummySpell->SpellIconID)
8887 {
8888 // Guard Dog
8889 case 201:
8890 {
8891 if (!victim)
8892 return false;
8893
8894 triggered_spell_id = 54445;
8895 target = this;
8896 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8897 victim->AddThreat(this, addThreat);
8898 break;
8899 }
8900 // Silverback
8901 case 1582:
8902 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8903 target = this;
8904 break;
8905 }
8906 break;
8907 }
8908 default:
8909 break;
8910 }
8911
8912 // if not handled by custom case, get triggered spell from dummySpell proto
8913 if (!triggered_spell_id)
8914 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8915
8916 // processed charge only counting case
8917 if (!triggered_spell_id)
8918 return true;
8919
8920 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8921 if (!triggerEntry)
8922 {
8923 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8924 return false;
8925 }
8926
8927 if (cooldown_spell_id == 0)
8928 cooldown_spell_id = triggered_spell_id;
8929
8930 if (cooldown)
8931 {
8932 if (HasSpellCooldown(cooldown_spell_id))
8933 return false;
8934
8935 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8936 }
8937
8938 if (basepoints0)
8939 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8940 else
8941 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8942
8943 return true;
8944}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition CreatureAIImpl.h:25
EnchantmentSlot
Definition Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:210
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:195
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:677
@ PLAYERSPELL_REMOVED
Definition Player.h:123
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
@ SPELL_EFFECT_ENERGIZE
Definition SharedDefines.h:819
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ MECHANIC_STUN
Definition SharedDefines.h:1348
@ MECHANIC_ROOT
Definition SharedDefines.h:1343
@ MECHANIC_SNARE
Definition SharedDefines.h:1347
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3789
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3794
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3793
@ SPELLFAMILY_POTION
Definition SharedDefines.h:3797
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3792
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3791
@ SPELLFAMILY_PET
Definition SharedDefines.h:3801
@ REP_EXALTED
Definition SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition SharedDefines.h:313
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:310
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:312
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition SpellMgr.h:122
WeaponAttackType
Definition Unit.h:215
T ApplyPct(T &base, U pct)
Definition Util.h:64
Definition Unit.h:380
uint32 GetEffectiveHeal() const
Definition Unit.h:420
uint8 GetSlot() const
Definition Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
bool IsEquipped() const
Definition Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10054
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9902
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16346
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1787
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11054
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2185
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5855
Unit * GetSelectedUnit() const
Definition Player.cpp:11496
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3521
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9371
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:409
Spell * m_spellModTakingSpell
Definition Player.h:2589
static WeaponAttackType GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:544
uint32 ProcChance
Definition SpellInfo.h:356
SpellInfo const * GetSpellInfo() const
Definition Spell.h:587
int32 GetPowerCost() const
Definition Spell.h:588
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15890
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5707
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition Unit.cpp:5379
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14965
void SetCantProc(bool apply)
Definition Unit.cpp:17539
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1101
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5028
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition Unit.cpp:12179
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10426
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12145
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1106
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition Unit.cpp:20292
Powers getPowerType() const
Definition Unit.h:1116
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:5360
Definition SpellMgr.h:547
SpellInfo const * last
Definition SpellMgr.h:551
uint8 rank
Definition SpellMgr.h:552
SpellInfo const * first
Definition SpellMgr.h:550

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellChainNode::first, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2037{
2039 packet.EmoteID = emoteId;
2040 packet.Guid = GetGUID();
2041 SendMessageToSet(packet.Write(), true);
2042}
Definition ChatPackets.h:29
WorldPacket const * Write() override
Definition ChatPackets.cpp:20
uint32 EmoteID
Definition ChatPackets.h:35
ObjectGuid Guid
Definition ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::UpdateAI(), boss_mimiron::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
10047{
10048 int32 scriptId = triggeredByAura->GetMiscValue();
10049
10050 if (!victim || !victim->IsAlive())
10051 return false;
10052
10053 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
10054 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
10055
10056 uint32 triggered_spell_id = 0;
10057
10058 switch (scriptId)
10059 {
10060 case 836: // Improved Blizzard (Rank 1)
10061 {
10062 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10063 return false;
10064 triggered_spell_id = 12484;
10065 break;
10066 }
10067 case 988: // Improved Blizzard (Rank 2)
10068 {
10069 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10070 return false;
10071 triggered_spell_id = 12485;
10072 break;
10073 }
10074 case 989: // Improved Blizzard (Rank 3)
10075 {
10076 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10077 return false;
10078 triggered_spell_id = 12486;
10079 break;
10080 }
10081 case 4533: // Dreamwalker Raiment 2 pieces bonus
10082 {
10083 // Chance 50%
10084 if (!roll_chance_i(50))
10085 return false;
10086
10087 switch (victim->getPowerType())
10088 {
10089 case POWER_MANA:
10090 triggered_spell_id = 28722;
10091 break;
10092 case POWER_RAGE:
10093 triggered_spell_id = 28723;
10094 break;
10095 case POWER_ENERGY:
10096 triggered_spell_id = 28724;
10097 break;
10098 default:
10099 return false;
10100 }
10101 break;
10102 }
10103 case 4537: // Dreamwalker Raiment 6 pieces bonus
10104 triggered_spell_id = 28750; // Blessing of the Claw
10105 break;
10106 case 5497: // Improved Mana Gems
10107 triggered_spell_id = 37445; // Mana Surge
10108 break;
10109 case 7010: // Revitalize - can proc on full hp target
10110 case 7011:
10111 case 7012:
10112 {
10113 if (!roll_chance_i(triggeredByAura->GetAmount()))
10114 return false;
10115 switch (victim->getPowerType())
10116 {
10117 case POWER_MANA:
10118 triggered_spell_id = 48542;
10119 break;
10120 case POWER_RAGE:
10121 triggered_spell_id = 48541;
10122 break;
10123 case POWER_ENERGY:
10124 triggered_spell_id = 48540;
10125 break;
10126 case POWER_RUNIC_POWER:
10127 triggered_spell_id = 48543;
10128 break;
10129 default:
10130 break;
10131 }
10132 break;
10133 }
10134 default:
10135 break;
10136 }
10137
10138 // not processed
10139 if (!triggered_spell_id)
10140 return false;
10141
10142 // standard non-dummy case
10143 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10144
10145 if (!triggerEntry)
10146 {
10147 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10148 return false;
10149 }
10150
10151 if (cooldown)
10152 {
10153 if (HasSpellCooldown(triggered_spell_id))
10154 return false;
10155
10156 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10157 }
10158
10159 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10160
10161 return true;
10162}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2793{
2794 while (count)
2795 {
2796 --count;
2797 AttackerStateUpdate(victim, BASE_ATTACK, true);
2798 }
2799}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2597

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
9144{
9145 // Get triggered aura spell info
9146 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9147
9148 // Basepoints of trigger aura
9149 int32 triggerAmount = triggeredByAura->GetAmount();
9150
9151 // Set trigger spell id, target, custom basepoints
9152 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9153
9154 Unit* target = nullptr;
9155 int32 basepoints0 = 0;
9156
9157 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9158 basepoints0 = triggerAmount;
9159
9160 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9161 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9162
9163 // Try handle unknown trigger spells
9164 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9165 {
9166 switch (auraSpellInfo->SpellFamilyName)
9167 {
9169 switch (auraSpellInfo->Id)
9170 {
9171 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9172 // Pct value stored in dummy
9173 if (!victim)
9174 return false;
9175 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9176 target = victim;
9177 break;
9178 case 57345: // Darkmoon Card: Greatness
9179 {
9180 float stat = 0.0f;
9181 // strength
9182 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9183 // agility
9184 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9185 // intellect
9186 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9187 // spirit
9188 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9189 break;
9190 }
9191 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9192 {
9193 if (!damage)
9194 return false;
9195 float stat = 0.0f;
9196 // strength
9197 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9198 // agility
9199 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9200 break;
9201 }
9202 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9203 {
9204 if (!damage)
9205 return false;
9206 float stat = 0.0f;
9207 // strength
9208 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9209 // agility
9210 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9211 break;
9212 }
9213 case 27522: // Mana Drain Trigger
9214 case 40336: // Mana Drain Trigger
9215 case 46939: // Black Bow of the Betrayer
9216 {
9217 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9218 if (IsAlive())
9219 CastSpell(this, 29471, true, castItem, triggeredByAura);
9220 if (victim && victim->IsAlive())
9221 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9222 return true;
9223 }
9224 // Forge of Souls, Devourer of Souls, Mirrored Soul
9225 case 69023:
9226 {
9227 int32 dmg = damage * 0.45f;
9228 if (dmg > 0)
9229 if (Aura* a = GetAura(69023))
9230 if (Unit* c = a->GetCaster())
9231 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9232 return true;
9233 }
9234 // Soul-Trader Beacon proc aura
9235 case 50051:
9236 {
9237 if (!victim)
9238 return false;
9239
9240 if (Creature* cr = GetCompanionPet())
9241 cr->CastSpell(victim, 50101, true);
9242
9243 return false;
9244 }
9245 }
9246 break;
9247 case SPELLFAMILY_MAGE:
9248 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9249 {
9250 switch (auraSpellInfo->Id)
9251 {
9252 case 31641: // Rank 1
9253 case 31642: // Rank 2
9254 trigger_spell_id = 31643;
9255 break;
9256 default:
9257 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9258 return false;
9259 }
9260 }
9261 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9262 {
9263 Creature* creature = victim->ToCreature();
9264 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9265 return false;
9266 }
9267 break;
9269 {
9270 // Nether Protection
9271 if (auraSpellInfo->SpellIconID == 1985)
9272 {
9273 if (!procSpell)
9274 return false;
9275 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9276 {
9278 return false; // ignore
9279 case SPELL_SCHOOL_HOLY:
9280 trigger_spell_id = 54370;
9281 break;
9282 case SPELL_SCHOOL_FIRE:
9283 trigger_spell_id = 54371;
9284 break;
9286 trigger_spell_id = 54375;
9287 break;
9288 case SPELL_SCHOOL_FROST:
9289 trigger_spell_id = 54372;
9290 break;
9292 trigger_spell_id = 54374;
9293 break;
9295 trigger_spell_id = 54373;
9296 break;
9297 default:
9298 return false;
9299 }
9300 }
9301 break;
9302 }
9303 case SPELLFAMILY_PRIEST:
9304 {
9305 // Blessed Recovery
9306 if (auraSpellInfo->SpellIconID == 1875)
9307 {
9308 switch (auraSpellInfo->Id)
9309 {
9310 case 27811:
9311 trigger_spell_id = 27813;
9312 break;
9313 case 27815:
9314 trigger_spell_id = 27817;
9315 break;
9316 case 27816:
9317 trigger_spell_id = 27818;
9318 break;
9319 default:
9320 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9321 return false;
9322 }
9323 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9324 target = this;
9325 // Add remaining ticks to healing done
9326 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9327 return true;
9328 }
9329 break;
9330 }
9331 case SPELLFAMILY_DRUID:
9332 {
9333 switch (auraSpellInfo->Id)
9334 {
9335 // Druid Forms Trinket
9336 case 37336:
9337 {
9338 switch (GetShapeshiftForm())
9339 {
9340 case FORM_NONE:
9341 trigger_spell_id = 37344;
9342 break;
9343 case FORM_CAT:
9344 trigger_spell_id = 37341;
9345 break;
9346 case FORM_BEAR:
9347 case FORM_DIREBEAR:
9348 trigger_spell_id = 37340;
9349 break;
9350 case FORM_TREE:
9351 trigger_spell_id = 37342;
9352 break;
9353 case FORM_MOONKIN:
9354 trigger_spell_id = 37343;
9355 break;
9356 default:
9357 return false;
9358 }
9359 break;
9360 }
9361 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9362 case 67353:
9363 {
9364 switch (GetShapeshiftForm())
9365 {
9366 case FORM_CAT:
9367 trigger_spell_id = 67355;
9368 break;
9369 case FORM_BEAR:
9370 case FORM_DIREBEAR:
9371 trigger_spell_id = 67354;
9372 break;
9373 default:
9374 return false;
9375 }
9376 break;
9377 }
9378 default:
9379 break;
9380 }
9381 break;
9382 }
9383 case SPELLFAMILY_HUNTER:
9384 {
9385 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9386 {
9387 if (!victim)
9388 return false;
9389
9390 switch (auraSpellInfo->Id)
9391 {
9392 case 53234: // Rank 1
9393 case 53237: // Rank 2
9394 case 53238: // Rank 3
9395 trigger_spell_id = 63468;
9396 break;
9397 default:
9398 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9399 return false;
9400 }
9401 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9402 if (!TriggerPS)
9403 return false;
9404
9405 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9406 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9407 return true;
9408 }
9409 // Item - Hunter T9 4P Bonus (Steady Shot)
9410 else if (auraSpellInfo->Id == 67151)
9411 {
9412 if (!IsPlayer() || !ToPlayer()->GetPet())
9413 return false;
9414
9415 target = ToPlayer()->GetPet();
9416 trigger_spell_id = 68130;
9417 break;
9418 }
9419 break;
9420 }
9422 {
9423 switch (auraSpellInfo->Id)
9424 {
9425 case 37657: // Lightning Capacitor
9426 case 54841: // Thunder Capacitor
9427 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9428 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9429 {
9430 if (!victim || !victim->IsAlive() || !IsPlayer())
9431 return false;
9432
9433 uint32 stack_spell_id = 0;
9434 switch (auraSpellInfo->Id)
9435 {
9436 case 37657:
9437 stack_spell_id = 37658;
9438 trigger_spell_id = 37661;
9439 break;
9440 case 54841:
9441 stack_spell_id = 54842;
9442 trigger_spell_id = 54843;
9443 break;
9444 case 67712:
9445 stack_spell_id = 67713;
9446 trigger_spell_id = 67714;
9447 break;
9448 case 67758:
9449 stack_spell_id = 67759;
9450 trigger_spell_id = 67760;
9451 break;
9452 }
9453
9454 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9455 {
9456 return false;
9457 }
9458
9459 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9460
9461 Aura* dummy = GetAura(stack_spell_id);
9462 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9463 {
9464 return false;
9465 }
9466
9467 if (cooldown)
9468 {
9469 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9470 }
9471 RemoveAurasDueToSpell(stack_spell_id);
9472 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9473 return true;
9474 }
9475 default:
9476 // Illumination
9477 if (auraSpellInfo->SpellIconID == 241)
9478 {
9479 if (!procSpell)
9480 return false;
9481 // procspell is triggered spell but we need mana cost of original casted spell
9482 uint32 originalSpellId = procSpell->Id;
9483 // Holy Shock heal
9484 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9485 {
9486 switch (procSpell->Id)
9487 {
9488 case 25914:
9489 originalSpellId = 20473;
9490 break;
9491 case 25913:
9492 originalSpellId = 20929;
9493 break;
9494 case 25903:
9495 originalSpellId = 20930;
9496 break;
9497 case 27175:
9498 originalSpellId = 27174;
9499 break;
9500 case 33074:
9501 originalSpellId = 33072;
9502 break;
9503 case 48820:
9504 originalSpellId = 48824;
9505 break;
9506 case 48821:
9507 originalSpellId = 48825;
9508 break;
9509 default:
9510 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9511 return false;
9512 }
9513 }
9514 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9515 if (!originalSpell)
9516 {
9517 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9518 return false;
9519 }
9520 // percent stored in effect 1 (class scripts) base points
9521 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9522 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9523 trigger_spell_id = 20272;
9524 target = this;
9525 }
9526 break;
9527 }
9528 break;
9529 }
9530 case SPELLFAMILY_SHAMAN:
9531 {
9532 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9533 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9534 {
9535 // Do not proc off from self-casted items
9536 if (Spell const* spell = eventInfo.GetProcSpell())
9537 {
9538 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9539 {
9540 return false;
9541 }
9542 }
9543
9544 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9545 }
9546 // Nature's Guardian
9547 else if (auraSpellInfo->SpellIconID == 2013)
9548 {
9549 // Check health condition - should drop to less 30% (damage deal after this!)
9550 if (!HealthBelowPctDamaged(30, damage))
9551 return false;
9552
9553 if (victim && victim->IsAlive())
9554 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9555
9556 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9557 trigger_spell_id = 31616;
9558 target = this;
9559 }
9560 break;
9561 }
9563 {
9564 // Acclimation
9565 if (auraSpellInfo->SpellIconID == 1930)
9566 {
9567 if (!procSpell)
9568 return false;
9569 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9570 {
9572 return false; // ignore
9573 case SPELL_SCHOOL_HOLY:
9574 trigger_spell_id = 50490;
9575 break;
9576 case SPELL_SCHOOL_FIRE:
9577 trigger_spell_id = 50362;
9578 break;
9580 trigger_spell_id = 50488;
9581 break;
9582 case SPELL_SCHOOL_FROST:
9583 trigger_spell_id = 50485;
9584 break;
9586 trigger_spell_id = 50489;
9587 break;
9589 trigger_spell_id = 50486;
9590 break;
9591 default:
9592 return false;
9593 }
9594 }
9595 // Blood Presence (Improved)
9596 else if (auraSpellInfo->Id == 63611)
9597 {
9598 if (!IsPlayer())
9599 return false;
9600
9601 trigger_spell_id = 50475;
9602 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9603 }
9604 break;
9605 }
9606 }
9607 }
9608
9609 // All ok. Check current trigger spell
9610 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9611 if (!triggerEntry)
9612 {
9613 // Don't cast unknown spell
9614 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9615 return false;
9616 }
9617
9618 // not allow proc extra attack spell at extra attack
9619 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9620 {
9621 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9622
9623 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9624 if (lastExtraAttackSpell == trigger_spell_id)
9625 {
9626 return false;
9627 }
9628
9629 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9630 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9631 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9632 {
9633 return false;
9634 }
9635 }
9636
9637 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9638 // Custom triggered spells
9639 switch (auraSpellInfo->Id)
9640 {
9641 // Deep Wounds
9642 case 12834:
9643 case 12849:
9644 case 12867:
9645 {
9646 if (!IsPlayer())
9647 return false;
9648
9649 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9651 else
9653 break;
9654 }
9655 // Persistent Shield (Scarab Brooch trinket)
9656 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9657 case 26467:
9658 {
9659 basepoints0 = int32(CalculatePct(damage, 15));
9660 target = victim;
9661 trigger_spell_id = 26470;
9662 break;
9663 }
9664 // Unyielding Knights (item exploit 29108\29109)
9665 case 38164:
9666 {
9667 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9668 return false;
9669 break;
9670 }
9671 // Deflection
9672 case 52420:
9673 {
9674 if (!HealthBelowPct(35))
9675 return false;
9676 break;
9677 }
9678
9679 // Cheat Death
9680 case 28845:
9681 {
9682 // When your health drops below 20%
9683 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9684 return false;
9685 break;
9686 }
9687 // Deadly Swiftness (Rank 1)
9688 case 31255:
9689 {
9690 // whenever you deal damage to a target who is below 20% health.
9691 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9692 return false;
9693
9694 target = this;
9695 trigger_spell_id = 22588;
9696 [[fallthrough]];
9697 }
9698 // Bonus Healing (Crystal Spire of Karabor mace)
9699 case 40971:
9700 {
9701 // If your target is below $s1% health
9702 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9703 return false;
9704 break;
9705 }
9706 // Rapid Recuperation
9707 case 53228:
9708 case 53232:
9709 {
9710 // This effect only from Rapid Fire (ability cast)
9711 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9712 return false;
9713 break;
9714 }
9715 // Decimation
9716 case 63156:
9717 case 63158:
9718 // Can proc only if target has hp below 35%
9719 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9720 return false;
9721 break;
9722 // Ulduar, Hodir, Toasty Fire
9723 case 62821:
9724 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9725 return false;
9726 break;
9727 case 15337: // Improved Spirit Tap (Rank 1)
9728 case 15338: // Improved Spirit Tap (Rank 2)
9729 {
9730 if (!procSpell)
9731 return false;
9732
9733 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9734 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9735 return false;
9736
9737 target = victim;
9738 break;
9739 }
9740 // Professor Putricide - Ooze Spell Tank Protection
9741 case 71770:
9742 if (victim)
9743 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9744 return true;
9745 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9746 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9747 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9748 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9749 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9750 {
9751 // Procs only if damage takes health below $s1%
9752 if (!HealthBelowPctDamaged(triggerAmount, damage))
9753 return false;
9754 break;
9755 }
9756 default:
9757 break;
9758 }
9759
9760 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9761 {
9762 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9763 // Item - Death Knight T10 Melee 4P Bonus
9764 if (auraSpellInfo->Id == 70656)
9765 {
9767 return false;
9768
9769 for (uint8 i = 0; i < MAX_RUNES; ++i)
9770 if (ToPlayer()->GetRuneCooldown(i) == 0)
9771 return false;
9772 }
9773 // Blade Barrier
9774 else if (auraSpellInfo->SpellIconID == 85)
9775 {
9776 Player* plr = ToPlayer();
9777 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9778 return false;
9779
9781 return false;
9782 }
9783 // Rime
9784 else if (auraSpellInfo->SpellIconID == 56)
9785 {
9786 if (!IsPlayer())
9787 return false;
9788
9789 // Howling Blast
9791 }
9792 }
9793
9794 // Custom basepoints/target for exist spell
9795 // dummy basepoints or other customs
9796 switch (trigger_spell_id)
9797 {
9798 // Auras which should proc on area aura source (caster in this case):
9799 // Turn the Tables
9800 case 52914:
9801 case 52915:
9802 case 52910:
9803 // Honor Among Thieves
9804 case 51699:
9805 {
9806 target = triggeredByAura->GetBase()->GetCaster();
9807 if (!target)
9808 return false;
9809
9810 if (Player* pTarget = target->ToPlayer())
9811 {
9812 if (cooldown)
9813 {
9814 if (pTarget->HasSpellCooldown(trigger_spell_id))
9815 return false;
9816 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9817 }
9818
9819 Unit* cptarget = nullptr;
9820 if (trigger_spell_id == 51699)
9821 {
9822 cptarget = pTarget->GetComboTarget();
9823 if (!cptarget)
9824 {
9825 cptarget = pTarget->GetSelectedUnit();
9826 }
9827 }
9828 else
9829 cptarget = target;
9830
9831 if (cptarget)
9832 {
9833 target->CastSpell(cptarget, trigger_spell_id, true);
9834 return true;
9835 }
9836 }
9837 return false;
9838 }
9839 // Cast positive spell on enemy target
9840 case 20233: // Improved Lay on Hands (cast on target)
9841 {
9842 target = victim;
9843 break;
9844 }
9845 // Ruby Drake, Evasive Aura
9846 case 50241:
9847 {
9848 if (GetAura(50240))
9849 return false;
9850
9851 break;
9852 }
9853 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9854 case 15250: // Rogue Setup
9855 {
9856 // applied only for main target
9857 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9858 return false;
9859 break; // continue normal case
9860 }
9861 // Finish movies that add combo
9862 case 14189: // Seal Fate (Netherblade set)
9863 case 14157: // Ruthlessness
9864 {
9865 victim = nullptr;
9866 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9867 break;
9868 }
9869 // Item - Druid T10 Balance 2P Bonus
9870 case 16870:
9871 {
9872 if (HasAura(70718))
9873 CastSpell(this, 70721, true);
9874 RemoveAurasDueToSpell(trigger_spell_id);
9875 break;
9876 }
9877 // Shamanistic Rage triggered spell
9878 case 30824:
9879 {
9880 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9881 break;
9882 }
9883 // Enlightenment (trigger only from mana cost spells)
9884 case 35095:
9885 {
9886 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9887 return false;
9888 break;
9889 }
9890 case 46916: // Slam! (Bloodsurge proc)
9891 case 52437: // Sudden Death
9892 {
9893 // Item - Warrior T10 Melee 4P Bonus
9894 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9895 {
9896 if (!roll_chance_i(aurEff->GetAmount()))
9897 {
9898 // Xinef: dont allow normal proc to override set one
9899 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9900 return false;
9901 // Xinef: just to be sure
9902 RemoveAurasDueToSpell(70849);
9903 break;
9904 }
9905
9906 // Xinef: fully remove all auras and reapply once more
9907 RemoveAurasDueToSpell(70849);
9908 RemoveAurasDueToSpell(71072);
9909 RemoveAurasDueToSpell(71069);
9910
9911 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9912 if (trigger_spell_id == 46916)
9913 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9914 else
9915 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9916 }
9917 break;
9918 }
9919 // Sword and Board
9920 case 50227:
9921 {
9922 // Remove cooldown on Shield Slam
9923 if (IsPlayer())
9925 break;
9926 }
9927 // Maelstrom Weapon
9928 case 53817:
9929 {
9930 // have rank dependent proc chance, ignore too often cases
9931 // PPM = 2.5 * (rank of talent),
9932 uint32 rank = auraSpellInfo->GetRank();
9933 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9934 if (!roll_chance_i(20 * rank))
9935 return false;
9936
9937 // Item - Shaman T10 Enhancement 4P Bonus
9938 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9939 if (Aura const* maelstrom = GetAura(53817))
9940 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9941 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9942 CastSpell(this, 70831, true, castItem, triggeredByAura);
9943
9944 break;
9945 }
9946 // Astral Shift
9947 case 52179:
9948 {
9949 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9950 return false;
9951
9952 // Need stun, fear or silence mechanic
9953 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9954 return false;
9955 break;
9956 }
9957 // Glyph of Death's Embrace
9958 case 58679:
9959 {
9960 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9961 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9962 return false;
9963 break;
9964 }
9965 // Glyph of Death Grip
9966 case 58628:
9967 {
9968 // remove cooldown of Death Grip
9969 if (IsPlayer())
9970 ToPlayer()->RemoveSpellCooldown(49576, true);
9971 return true;
9972 }
9973 // Savage Defense
9974 case 62606:
9975 {
9976 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9977 break;
9978 }
9979 // Body and Soul
9980 case 64128:
9981 case 65081:
9982 {
9983 // Proc only from PW:S cast
9984 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9985 return false;
9986 break;
9987 }
9988 // Culling the Herd
9989 case 70893:
9990 {
9991 if (!procSpell)
9992 {
9993 return false;
9994 }
9995 // check if we're doing a critical hit
9996 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9997 return false;
9998 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9999 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
10000 return false;
10001 break;
10002 }
10003 // Fingers of Frost, synchronise with Frostbite
10004 case 44544:
10005 {
10006 if (procPhase == PROC_SPELL_PHASE_HIT)
10007 {
10008 // Find Frostbite
10010 {
10011 if (!victim)
10012 return false;
10013
10014 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
10015 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
10016 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
10017
10018 if (roll_chance_i(chance))
10019 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
10020 }
10021 }
10022 break;
10023 }
10024 }
10025
10026 // try detect target manually if not set
10027 if (!target)
10028 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
10029
10030 if (cooldown)
10031 {
10032 if (HasSpellCooldown(triggerEntry->Id))
10033 return false;
10034
10035 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
10036 }
10037
10038 if (basepoints0)
10039 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
10040 else
10041 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
10042
10043 return true;
10044}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition SharedDefines.h:808
@ SPELL_ATTR1_NO_THREAT
Definition SharedDefines.h:440
@ MECHANIC_FEAR
Definition SharedDefines.h:1341
@ MECHANIC_SILENCE
Definition SharedDefines.h:1345
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1316
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:244
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_MOONKIN
Definition UnitDefines.h:98
@ FORM_NONE
Definition UnitDefines.h:69
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_TREE
Definition UnitDefines.h:71
@ FORM_BEAR
Definition UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition Unit.h:299
@ SPELL_SWORD_SPECIALIZATION
Definition Unit.h:298
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition Creature.cpp:2166
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13501
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3529
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1302
Spell const * GetProcSpell() const
Definition Unit.h:455
Unit * GetActor()
Definition Unit.h:446
uint8 GetRank() const
Definition SpellInfo.cpp:2390
uint32 ManaCostPercentage
Definition SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
uint32 ManaCost
Definition SpellInfo.h:363
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition ThreatMgr.cpp:576
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1103
Creature * GetCompanionPet() const
Definition Unit.cpp:10876
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15672
uint32 GetLastExtraAttackSpell() const
Definition Unit.h:995
uint32 GetCreateHealth() const
Definition Unit.h:1097
Unit * GetComboTarget() const
Definition Unit.h:1001
float GetStat(Stats stat) const
Definition Unit.h:1043
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1102

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4386{
4387 if (thisUnit->SafeUnitPointerSet.empty())
4388 return;
4389 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4390 (*itr)->UnitDeleted();
4391
4392 thisUnit->SafeUnitPointerSet.clear();
4393}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19544{
19545 Creature* creature = ToCreature();
19546 if (creature && creature->IsAIEnabled)
19547 {
19548 if (!creature->AI()->BeforeSpellClick(clicker))
19549 {
19550 return false;
19551 }
19552 }
19553
19554 bool result = false;
19555 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19556 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19557 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19558 {
19560 if (!itr->second.IsFitToRequirements(clicker, this))
19561 continue;
19562
19564 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19565 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19566 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19567 continue;
19568
19569 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19570 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19571 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19572
19573 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19574
19575 // xinef: dont allow players to enter vehicles on arena
19576 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19577 continue;
19578
19579 if (seatId > -1)
19580 {
19581 uint8 i = 0;
19582 bool valid = false;
19583 while (i < MAX_SPELL_EFFECTS)
19584 {
19585 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19586 {
19587 valid = true;
19588 break;
19589 }
19590 ++i;
19591 }
19592
19593 if (!valid)
19594 {
19595 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19596 continue;
19597 }
19598
19599 if (IsInMap(caster))
19600 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19601 else // This can happen during Player::_LoadAuras
19602 {
19604 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19605 bp0[j] = spellInfo->Effects[j].BasePoints;
19606
19607 bp0[i] = seatId;
19608 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19609 }
19610 }
19611 else
19612 {
19613 if (IsInMap(caster))
19614 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19615 else
19616 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19617 }
19618
19619 result = true;
19620 }
19621
19622 if (creature && creature->IsAIEnabled)
19623 creature->AI()->OnSpellClick(clicker, result);
19624
19625 return result;
19626}
#define sConditionMgr
Definition ConditionMgr.h:292
std::list< Condition * > ConditionList
Definition ConditionMgr.h:239
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:409
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition SharedDefines.h:702
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition SharedDefines.h:703
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition SharedDefines.h:701
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:207
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:205
bool IsBattleArena() const
Definition Map.h:302
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:621
Definition ConditionMgr.h:184

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::AttachHeart(), boss_kologarn::AttachLeftArm(), boss_kologarn::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::UpdateAI().

◆ HandleStatFlatModifier()

bool Unit::HandleStatFlatModifier ( UnitMods  unitMod,
UnitModifierFlatType  modifierType,
float  amount,
bool  apply 
)
15323{
15324 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_FLAT_END)
15325 {
15326 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15327 return false;
15328 }
15329
15330 if (!amount)
15331 return false;
15332
15333 switch (modifierType)
15334 {
15335 case BASE_VALUE:
15336 case TOTAL_VALUE:
15337 m_auraFlatModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15338 break;
15339 default:
15340 break;
15341 }
15342
15343 UpdateUnitMod(unitMod);
15344 return true;
15345}
void apply(T *val)
Definition ByteConverter.h:40

References BASE_VALUE, LOG_ERROR, m_auraFlatModifiersGroup, MODIFIER_TYPE_FLAT_END, TOTAL_VALUE, UNIT_MOD_END, and UpdateUnitMod().

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), and Player::UpdateDamageDoneMods().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1473 {
1474 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1475 return HasAuras(SearchMethod::MatchAll, spellList);
1476 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5824

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5854

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5848{
5849 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5850 return true;
5851 return false;
5852}

References GetAuraApplication().

Referenced by at_hol_hall_of_watchers::_OnTrigger(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyItemDependentAuras(), Player::ApplyItemObtainSpells(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_q12237_rescue_villager::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_thekal::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_anub_arak::DamageTaken(), boss_razorscale::DamageTaken(), boss_thorim::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), boss_krik_thir::boss_krik_thirAI::IsInFrenzy(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::JustEngagedWith(), boss_freya_elder_stonebark::JustEngagedWith(), boss_freya_elder_brightleaf::JustEngagedWith(), boss_freya_elder_ironbranch::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::KilledUnit(), Creature::LoadCreaturesAddon(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_fa_la_la_la_ogrila::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::SetData(), boss_anomalus::SetData(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_pool_of_tar::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_magus_telestra::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_freya_elder_stonebark::UpdateAI(), boss_vezax::UpdateAI(), npc_ulduar_hodir_priest::UpdateAI(), npc_ulduar_hodir_druid::UpdateAI(), npc_ulduar_hodir_shaman::UpdateAI(), npc_ulduar_hodir_mage::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), npc_ulduar_storm_tempered_keeper::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5795{
5796 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5797 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5798 {
5799 if (itr->second->HasEffect(effIndex)
5800 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5801 {
5802 return true;
5803 }
5804 }
5805 return false;
5806}

References m_appliedAuras.

Referenced by AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5825{
5826 if (sm == SearchMethod::MatchAll)
5827 {
5828 for (auto const& spellId : spellIds)
5829 if (!HasAura(spellId))
5830 return false;
5831 return true;
5832 }
5833 else if (sm == SearchMethod::MatchAny)
5834 {
5835 for (auto const& spellId : spellIds)
5836 if (HasAura(spellId))
5837 return true;
5838 return false;
5839 }
5840 else
5841 {
5842 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5843 return false;
5844 }
5845}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10758{
10759 if (Caster)
10760 {
10761 if (spellProto)
10762 {
10763 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10764 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10765 if ((*j)->IsAffectedOnSpell(spellProto))
10766 return true;
10767 }
10768 // Check per caster aura state
10769 // If aura with aurastate by caster not found return false
10770 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10771 {
10772 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10773 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10774 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10775 return true;
10776 return false;
10777 }
10778 }
10779
10780 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10781}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:669

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5855{
5856 return (!m_modAuras[auraType].empty());
5857}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), HasWaterWalkAura(), Player::IsFreeFlying(), and Player::SendInitialPacketsAfterAddToMap().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5888{
5889 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5890 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5891 if ((*i)->IsAffectedOnSpell(affectedSpell))
5892 return true;
5893 return false;
5894}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5860{
5861 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5862 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5863 if (caster == (*i)->GetCasterGUID())
5864 return true;
5865 return false;
5866}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), ThreatContainer::IsPreferredTarget(), and PatchValuesUpdate().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
780{
781 if (!HasAuraType(auraType))
782 return false;
783 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
784 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
785 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
786 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
787 return true;
788 return false;
789}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5879{
5880 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5881 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5882 if (miscvalue == (*i)->GetMiscValue())
5883 return true;
5884 return false;
5885}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5906{
5907 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5908 {
5909 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5910 {
5911 return true;
5912 }
5913 }
5914
5915 return false;
5916}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5897{
5898 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5899 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5900 if (value == (*i)->GetAmount())
5901 return true;
5902 return false;
5903}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5942{
5943 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5944 {
5945 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5946 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5947 return true;
5948
5949 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5950 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5951 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5952 return true;
5953 }
5954
5955 return false;
5956}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
792{
793 AuraEffectList const& auras = GetAuraEffectsByType(type);
794 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
795 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
796 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
797 return true;
798 return false;
799}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
802{
803 uint32 excludeAura = 0;
804 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
805 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
806
812}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition Unit.cpp:791
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1561

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1782{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1710 {
1712 && !IsWalking();
1713 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition UnitDefines.h:371
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition UnitDefines.h:372
bool IsWalking() const
Definition Unit.h:1687
bool HasMovementFlag(uint32 flag) const
Definition Object.h:345

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
968{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:973

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5931{
5932 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5933 {
5934 Aura const* aura = iter->second->GetBase();
5935 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5936 return true;
5937 }
5938 return false;
5939}
uint32 Attributes
Definition SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5919{
5920 if (!(m_interruptMask & flag))
5921 return false;
5922 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5923 {
5924 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5925 return true;
5926 }
5927 return false;
5928}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::IsPreferredTarget().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
969{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
970{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

References HasAuraType(), and SPELL_AURA_MOD_ROOT.

Referenced by SetControlled().

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1321{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

bool Unit::HasStunAura ( ) const
inline

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
737{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_power_spark::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), boss_sartharion_dragonAI::HandleExtraEvent(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::JustSummoned(), CreatureGroup::LeaderMoveTo(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_sartharion_dragonAI::MoveInLineOfSight(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), MotionMaster::MoveWaypoint(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), SetCharm(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), boss_anub_arak::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), npc_xt002_heart::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and WorldSession::VerifyMovementInfo().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
726{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), SmartAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_eck::boss_eck(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krik_thir::boss_krik_thirAI::boss_krik_thirAI(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_tenris_mirkblood::boss_tenris_mirkblood(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), BossAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), IsImmobilizedState(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), ThreatContainer::IsPreferredTarget(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_novos::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), BossAI::OnSpellCastFinished(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetInCombatState(), SetInFront(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::UpdateAI(), boss_hadronox::UpdateAI(), boss_sartharion::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::UpdateAI(), npc_nexus_lord::UpdateAI(), npc_scion_of_eternity::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_ionar::UpdateAI(), boss_volkhan::UpdateAI(), npc_molten_golem::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_steelbreaker::UpdateAI(), boss_runemaster_molgeim::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_auriaya_sanctum_sentry::UpdateAI(), npc_auriaya_feral_defender::UpdateAI(), boss_flame_leviathan::UpdateAI(), boss_freya::UpdateAI(), boss_freya_elder_stonebark::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), boss_freya_elder_ironbranch::UpdateAI(), boss_freya_summons::UpdateAI(), boss_vezax::UpdateAI(), boss_hodir::UpdateAI(), npc_ulduar_hodir_priest::UpdateAI(), npc_ulduar_hodir_druid::UpdateAI(), npc_ulduar_hodir_shaman::UpdateAI(), npc_ulduar_hodir_mage::UpdateAI(), boss_ignis::UpdateAI(), boss_kologarn::UpdateAI(), npc_ulduar_leviathan_mkii::UpdateAI(), npc_ulduar_vx001::UpdateAI(), npc_ulduar_aerial_command_unit::UpdateAI(), boss_razorscale::UpdateAI(), boss_thorim::UpdateAI(), boss_thorim_sif::UpdateAI(), boss_thorim_start_npcs::UpdateAI(), boss_thorim_gauntlet_npcs::UpdateAI(), boss_thorim_runic_colossus::UpdateAI(), boss_thorim_ancient_rune_giant::UpdateAI(), boss_thorim_arena_npcs::UpdateAI(), boss_xt002::UpdateAI(), boss_yoggsaron_sara::UpdateAI(), boss_yoggsaron::UpdateAI(), boss_yoggsaron_constrictor_tentacle::UpdateAI(), boss_yoggsaron_immortal_guardian::UpdateAI(), npc_ulduar_storm_tempered_keeper::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::UpdateAI(), boss_yoggsaron_corruptor_tentacle::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5869{
5870 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5871 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5872 if ((*i)->GetBase()->CanBeSentToClient())
5873 return true;
5874
5875 return false;
5876}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

973{ return CanUseAttackType(type); }
bool CanUseAttackType(WeaponAttackType attacktype) const
Definition Unit.h:977

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
523{
524 if (Player const* player = ToPlayer())
525 return player->GetWeaponForAttack(OFF_ATTACK, true);
526
527 return CanDualWield();
528}
bool CanDualWield() const
Definition Unit.h:963

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11458{
11459 uint32 heal = healInfo.GetHeal();
11460 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11461 healInfo.SetHeal(heal);
11462
11463 // calculate heal absorb and reduce healing
11464 CalcHealAbsorb(healInfo);
11465
11466 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11467 healInfo.SetEffectiveHeal(gain);
11468
11469 SendHealSpellLog(healInfo, critical);
11470 return gain;
11471}
Unit * GetHealer() const
Definition Unit.h:417
void SetHeal(uint32 amount)
Definition Unit.h:407
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:412
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2534
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:11167
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11440

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1101{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), npc_wild_wyrm::PassengerBoarded(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::UpdateAI(), boss_yoggsaron_immortal_guardian::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1102{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), npc_anub_ar_crusher::DamageTaken(), boss_sartharion::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_algalon_the_observer::DamageTaken(), npc_xt002_boombot::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_malygos::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::DamageTaken(), boss_yoggsaron_brain::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15148{
15149 // Checking for existing in the table
15150 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15151 {
15152 if (i->DRGroup != group)
15153 continue;
15154 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15155 i->hitCount += 1;
15156 return;
15157 }
15159}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:261
Definition Unit.h:279

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
16042{
16043 if (!m_charmInfo)
16044 m_charmInfo = new CharmInfo(this);
16045
16046 return m_charmInfo;
16047}
Definition CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1055 {
1056 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1057 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1058 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17649{
17650 Player* player = ToPlayer();
17651 PetStable& petStable = player->GetOrInitPetStable();
17652 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17653 return false;
17654
17655 pet->SetCreatorGUID(GetGUID());
17656 pet->SetFaction(GetFaction());
17657 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17658
17659 if (IsPlayer())
17661
17662 if (!pet->InitStatsForLevel(level))
17663 {
17664 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17665 return false;
17666 }
17667
17668 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17669 // this enables pet details window (Shift+P)
17670 pet->InitPetCreateSpells();
17671 pet->SetFullHealth();
17672 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17673 return true;
17674}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:212
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:240
Optional< PetInfo > CurrentPet
Definition PetDefines.h:235
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2459
void InitPetCreateSpells()
Definition Pet.cpp:2034
PetStable & GetOrInitPetStable()
Definition Player.cpp:15686
void SetFullHealth()
Definition Unit.h:1111
void SetFaction(uint32 faction)
Definition Unit.cpp:10241
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:740
CharmInfo * GetCharmInfo()
Definition Unit.h:1266
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:706
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4177{
4178 // generic spells are interrupted if they are not finished or delayed
4179 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4180 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4181
4182 // autorepeat spells are interrupted if they are not finished or delayed
4183 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4184 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4185
4186 // channeled spells are interrupted if they are not finished, even if they are delayed
4187 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4188 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4189}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_runemaster_molgeim::JustEngagedWith(), boss_stormcaller_brundir::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::SpellHit(), boss_flame_leviathan::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_mimiron::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4105{
4106 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4107 Spell* spell = m_currentSpells[spellType];
4108 if (spell
4109 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4110 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4111 {
4112 // for example, do not let self-stun aura interrupt itself
4113 if (!spell->IsInterruptable())
4114 return;
4115
4116 // send autorepeat cancel message for autorepeat spells
4117 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4118 if (IsPlayer())
4120
4121 if (spell->getState() != SPELL_STATE_FINISHED)
4122 spell->cancel(bySelf);
4123 else
4124 {
4125 m_currentSpells[spellType] = nullptr;
4126 spell->SetReferencedFromCurrent(false);
4127 }
4128
4129 if (IsCreature() && IsAIEnabled)
4131 }
4132}
@ SPELL_FINISHED_CANCELED
Definition Spell.h:99
@ SPELL_STATE_DELAYED
Definition Spell.h:239
virtual void OnSpellCastFinished(SpellInfo const *, SpellFinishReason)
Definition CreatureAI.h:151
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:153
bool IsInterruptable() const
Definition Spell.h:572
int32 GetCastTime() const
Definition Spell.h:558
uint32 getState() const
Definition Spell.h:493
void cancel(bool bySelf=false)
Definition Spell.cpp:3647

References Creature::AI(), Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::GetSpellInfo(), Spell::getState(), IsAIEnabled, Object::IsCreature(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, CreatureAI::OnSpellCastFinished(), Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_FINISHED_CANCELED, SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToCreature(), and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2207{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1773{ return (m_deathState == DeathState::Alive); };

References Alive, and m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Battleground::AddPlayer(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freya(), boss_hodir::boss_hodir(), boss_mimiron::boss_mimiron(), boss_thorim::boss_thorim(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_q12237_rescue_villager::CheckCast(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), boss_heigan::CheckSafetyDance(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), boss_krik_thir::boss_krik_thirAI::GetData(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_dred_raptor_call::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_sartharion::JustEngagedWith(), boss_freya::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), npc_kiljaeden_controller::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_anetheron::KilledUnit(), boss_azgalor::KilledUnit(), boss_kazrogal::KilledUnit(), boss_rage_winterchill::KilledUnit(), boss_hadronox::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), npc_scion_of_eternity::npc_scion_of_eternity(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_eye_of_eternity::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_eoe_wyrmrest_skytalon::PassengerBoarded(), boss_kologarn::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), SetFeared(), SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_malygos::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::UpdateAI(), boss_vezax::UpdateAI(), boss_ignis::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14388{
14390 return true;
14391
14392 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14393 return true;
14394
14395 if (Player* ownerPlayer = GetSpellModOwner())
14396 if (Player const* seerPlayer = seer->ToPlayer())
14397 {
14398 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14399 return true;
14400 }
14401
14402 return false;
14403}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:760

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14369{
14371 return true;
14372
14373 // Always seen by owner
14374 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14375 if (seer->GetGUID() == guid)
14376 return true;
14377
14378 if (Player const* seerPlayer = seer->ToPlayer())
14379 if (Unit* owner = GetOwner())
14380 if (Player* ownerPlayer = owner->ToPlayer())
14381 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14382 return true;
14383
14384 return false;
14385}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:757

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:331
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:753

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10673{
10675 return true;
10676
10677 if (!m_Controlled.empty())
10678 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10679 if ((*itr)->isAttackingPlayer())
10680 return true;
10681
10682 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10683 if (m_SummonSlot[i])
10684 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10685 if (summon->isAttackingPlayer())
10686 return true;
10687
10688 return false;
10689}
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2357

References Map::GetCreature(), WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19504{
19505 // Mirroring clientside gameplay logic
19506 if (ShapeshiftForm form = GetShapeshiftForm())
19507 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19508 return entry->attackSpeed > 0;
19509
19510 return false;
19511}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition UnitDefines.h:340

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition UnitDefines.h:336

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

692{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3161{
3163 return true;
3164 return false;
3165}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsClientControlled()

bool Unit::IsClientControlled ( Player const *  exactClient = nullptr) const
21451{
21452 // Severvide method to check if unit is client controlled (optionally check for specific client in control)
21453
21454 // Applies only to player controlled units
21456 return false;
21457
21458 // These flags are meant to be used when server controls this unit, client control is taken away
21460 return false;
21461
21462 // If unit is possessed, it has lost original control...
21463 if (ObjectGuid const& guid = GetCharmerGUID())
21464 {
21465 // ... but if it is a possessing charm, then we have to check if some other player controls it
21466 if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED) && guid.IsPlayer())
21467 return (exactClient ? (exactClient->GetGUID() == guid) : true);
21468 return false;
21469 }
21470
21471 // By default: players have client control over themselves
21472 if (IsPlayer())
21473 return (exactClient ? (exactClient == this) : true);
21474 return false;
21475}
@ UNIT_FLAG_CONFUSED
Definition UnitDefines.h:276
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:256
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:277

References GetCharmerGUID(), Object::GetGUID(), Object::HasFlag(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_FLEEING, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by GetClientControlling(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
1015 {
1016 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1017 return entry->IsContestedGuardFaction();
1018
1019 return false;
1020 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1293{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsCrowdControlled()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2045{
2046 // only physical spells damage gets reduced by armor
2047 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2048 return false;
2049 if (spellInfo)
2050 {
2051 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2052 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2053 return false;
2054
2055 // bleeding effects are not reduced by armor
2056 if (effIndex != MAX_SPELL_EFFECTS)
2057 {
2058 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2059 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2060 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2061 return false;
2062 }
2063 }
2064 return true;
2065}
@ MECHANIC_BLEED
Definition SharedDefines.h:1351
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline

References Corpse, Dead, and m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1774{ return (m_deathState == DeathState::JustDied); };

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10427{
10428 return GetReactionTo(unit) >= REP_FRIENDLY;
10429}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:319

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition UnitDefines.h:337

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHighestExclusiveAura()

bool Unit::IsHighestExclusiveAura ( Aura const *  aura,
bool  removeOtherAuraApplications = false 
)
4435{
4436 for (uint32 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
4437 if (AuraEffect const* aurEff = aura->GetEffect(i))
4438 if (!IsHighestExclusiveAuraEffect(aura->GetSpellInfo(), aurEff->GetAuraType(), aurEff->GetAmount(), aura->GetEffectMask(), removeOtherAuraApplications))
4439 return false;
4440
4441 return true;
4442}
bool IsHighestExclusiveAuraEffect(SpellInfo const *spellInfo, AuraType auraType, int32 effectAmount, uint8 auraEffectMask, bool removeOtherAuraApplications=false)
Definition Unit.cpp:4444

References Aura::GetEffect(), Aura::GetEffectMask(), Aura::GetSpellInfo(), IsHighestExclusiveAuraEffect(), and MAX_SPELL_EFFECTS.

Referenced by _RemoveNoStackAurasDueToAura().

◆ IsHighestExclusiveAuraEffect()

bool Unit::IsHighestExclusiveAuraEffect ( SpellInfo const *  spellInfo,
AuraType  auraType,
int32  effectAmount,
uint8  auraEffectMask,
bool  removeOtherAuraApplications = false 
)
4445{
4446 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
4447 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end();)
4448 {
4449 AuraEffect const* existingAurEff = (*itr);
4450 ++itr;
4451
4452 if (sSpellMgr->CheckSpellGroupStackRules(spellInfo, existingAurEff->GetSpellInfo()) == SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST)
4453 {
4454 int32 diff = abs(effectAmount) - abs(existingAurEff->GetAmount());
4455 if (!diff)
4456 for (int32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4457 diff += int32((auraEffectMask & (1 << i)) >> i) - int32((existingAurEff->GetBase()->GetEffectMask() & (1 << i)) >> i);
4458
4459 if (diff > 0)
4460 {
4461 Aura const* base = existingAurEff->GetBase();
4462 // no removing of area auras from the original owner, as that completely cancels them
4463 if (removeOtherAuraApplications && (!base->IsArea() || base->GetOwner() != this))
4464 {
4465 if (AuraApplication* aurApp = existingAurEff->GetBase()->GetApplicationOfTarget(GetGUID()))
4466 {
4467 bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType);
4468 uint32 removedAuras = m_removedAurasCount;
4469 RemoveAura(aurApp);
4470 if (hasMoreThanOneEffect || m_removedAurasCount > removedAuras)
4471 itr = auras.begin();
4472 }
4473 }
4474 }
4475 else if (diff < 0)
4476 return false;
4477 }
4478 }
4479
4480 return true;
4481}
@ SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST
Definition SpellMgr.h:369
bool HasMoreThanOneEffectForType(AuraType auraType) const
Definition SpellAuras.cpp:1014
bool IsArea() const
Definition SpellAuras.cpp:1024

References AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraEffect::GetBase(), Aura::GetEffectMask(), Object::GetGUID(), Aura::GetOwner(), AuraEffect::GetSpellInfo(), Aura::HasMoreThanOneEffectForType(), Aura::IsArea(), m_removedAurasCount, MAX_SPELL_EFFECTS, RemoveAura(), SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST, and sSpellMgr.

Referenced by IsHighestExclusiveAura().

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10432{
10433 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10434 if (!my_faction || !my_faction->faction)
10435 return false;
10436
10437 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10438 if (raw_faction && raw_faction->reputationListID >= 0)
10439 return false;
10440
10441 return my_faction->IsHostileToPlayers();
10442}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

bool Unit::IsHovering ( ) const
inline

◆ IsHunterPet()

◆ IsImmobilizedState()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12971{
12972 SpellInfo const* spellInfo = spell->GetSpellInfo();
12973 if (!spellInfo)
12974 {
12975 return false;
12976 }
12977
12979 {
12980 return false;
12981 }
12982
12984 {
12985 return false;
12986 }
12987
12988 uint32 schoolMask = spell->GetSpellSchoolMask();
12989 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12990 {
12991 return false;
12992 }
12993
12994 // If m_immuneToDamage type contain magic, IMMUNE damage.
12995 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12996 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12997 {
12998 if ((itr->type & schoolMask) == schoolMask)
12999 {
13000 return true;
13001 }
13002 }
13003
13004 return false;
13005}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition SharedDefines.h:493
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition SharedDefines.h:446
@ IMMUNITY_DAMAGE
Definition SharedDefines.h:1408
@ SPELL_SCHOOL_MASK_NONE
Definition SharedDefines.h:307
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12939{
12940 if (!spellInfo)
12941 {
12942 return false;
12943 }
12944
12945 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12946 {
12947 return false;
12948 }
12949
12950 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12951 {
12952 return false;
12953 }
12954
12955 uint32 schoolMask = spellInfo->GetSchoolMask();
12956 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12957 {
12958 return false;
12959 }
12960
12961 // If m_immuneToDamage type contain magic, IMMUNE damage.
12962 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12963 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12964 if ((itr->type & schoolMask) == schoolMask)
12965 return true;
12966
12967 return false;
12968}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12923{
12924 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12925 {
12926 return false;
12927 }
12928
12929 // If m_immuneToDamage type contain magic, IMMUNE damage.
12930 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12931 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12932 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12933 return true;
12934
12935 return false;
12936}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
13087{
13088 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
13089}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:13007
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12922

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
13047{
13048 SpellInfo const* spellInfo = spell->GetSpellInfo();
13050 {
13051 return false;
13052 }
13053
13054 uint32 schoolMask = spell->GetSpellSchoolMask();
13055 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
13056 {
13057 return false;
13058 }
13059
13060 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13061 {
13062 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13063 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13064 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13065 {
13066 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
13067 {
13068 return true;
13069 }
13070 }
13071 }
13072
13073 return false;
13074}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1407
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
13024{
13025 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13026 return false;
13027
13028 uint32 schoolMask = spellInfo->GetSchoolMask();
13029 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
13030 {
13031 return false;
13032 }
13033
13034 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13035 {
13036 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13037 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13038 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13039 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
13040 return true;
13041 }
13042
13043 return false;
13044}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
13008{
13009 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
13010 {
13011 return false;
13012 }
13013
13014 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13015 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13016 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13017 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
13018 return true;
13019
13020 return false;
13021}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), IsImmunedToDamageOrSchool(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

13092{
13093 if (!spellInfo)
13094 return false;
13095
13096 // Single spell immunity.
13097 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
13098 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
13099 if (itr->type == spellInfo->Id)
13100 return true;
13101
13102 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13103 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13104 if (!allowIdList.empty())
13105 {
13106 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13107 if (itr->type == spellInfo->Id)
13108 return false;
13109 return true;
13110 }
13111
13112 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13113 return false;
13114
13115 if (spellInfo->Dispel)
13116 {
13117 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13118 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13119 if (itr->type == spellInfo->Dispel)
13120 return true;
13121 }
13122
13123 // Spells that don't have effectMechanics.
13124 if (spellInfo->Mechanic)
13125 {
13126 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13127 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13128 if (itr->type == spellInfo->Mechanic)
13129 return true;
13130 }
13131
13132 bool immuneToAllEffects = true;
13133 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13134 {
13135 // State/effect immunities applied by aura expect full spell immunity
13136 // Ignore effects with mechanic, they are supposed to be checked separately
13137 if (!spellInfo->Effects[i].IsEffect())
13138 continue;
13139
13140 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13141 if (IsImmunedToSpellEffect(spellInfo, i))
13142 {
13143 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13144 return true;
13145 continue;
13146 }
13147
13148 immuneToAllEffects = false;
13149 break;
13150 }
13151 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13152 return true;
13153
13154 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13155 {
13156 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13157 if (spell)
13158 {
13159 spellSchoolMask = spell->GetSpellSchoolMask();
13160 }
13161
13162 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13163 {
13164 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13165 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13166 {
13167 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13168 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13169 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13170 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13171 {
13172 return true;
13173 }
13174 }
13175 }
13176 }
13177
13178 return false;
13179}
@ IMMUNITY_ALLOW_ID
Definition SharedDefines.h:1412
@ IMMUNITY_ID
Definition SharedDefines.h:1411
@ IMMUNITY_MECHANIC
Definition SharedDefines.h:1410

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13182{
13183 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13184 return false;
13185
13186 // xinef: pet scaling auras
13187 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13188 return false;
13189
13190 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13191 return false;
13192
13193 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13194 uint32 effect = spellInfo->Effects[index].Effect;
13195 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13196 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13197 {
13198 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13199 {
13200 return true;
13201 }
13202 }
13203
13204 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13205 {
13206 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13207 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13208 if (itr->type == mechanic)
13209 return true;
13210 }
13211
13212 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13213 {
13215 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13216 {
13217 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13218 {
13219 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13220 {
13221 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13222 {
13223 return true;
13224 }
13225 }
13226 }
13227 }
13228
13229 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13230 {
13231 // Check for immune to application of harmful magical effects
13233 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13234 {
13235 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13236 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13237 !spellInfo->IsPositiveEffect(index) && // Harmful
13238 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13239 {
13240 return true;
13241 }
13242 }
13243 }
13244 }
13245
13246 return false;
13247}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition SharedDefines.h:816
@ SPELL_ATTR3_ALWAYS_HIT
Definition SharedDefines.h:522
@ IMMUNITY_STATE
Definition SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1405
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition SharedDefines.h:566
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21335

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
915{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4250{
4251 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4252 {
4253 // skip transport check, check for being below floor level
4254 if (this->GetPositionZ() < 28.0f)
4255 return false;
4256 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4257 if (Battleground* bg = bgMap->GetBG())
4258 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4259 return false;
4260 }
4261 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4262 {
4263 // if static transport doesn't match - return false
4264 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4265 return false;
4266
4267 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4268 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4269 {
4270 if (c->GetTransport() != this->GetTransport())
4271 return false;
4272 if (this->GetTransport())
4273 {
4274 if (c->GetPositionY() < 2033.0f)
4275 {
4276 if (this->GetPositionY() > 2033.0f)
4277 return false;
4278 }
4279 else if (c->GetPositionY() < 2438.0f)
4280 {
4281 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4282 return false;
4283 }
4284 else if (this->GetPositionY() < 2438.0f)
4285 return false;
4286 }
4287 }
4288 }
4289 else
4290 {
4291 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4292 if (c->GetTransport() != this->GetTransport())
4293 return false;
4294 }
4295
4296 LiquidStatus liquidStatus = GetLiquidData().Status;
4297 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4298
4299 // In water or jumping in water
4300 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4301 {
4302 return c->CanEnterWater();
4303 }
4304 else
4305 {
4306 return c->CanWalk() || c->CanFly();
4307 }
4308}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:262
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:266
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
Definition Map.h:681
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:381
bool IsFalling() const
Definition Unit.cpp:19938
LiquidData const & GetLiquidData() const
Definition Object.cpp:3115
LiquidStatus Status
Definition GridTerrainData.h:206

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_dred_raptor_call::HandleDummy(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_sartharion_dragonAI::HandleExtraEvent(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), npc_kiljaeden_controller::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), BossAI::OnSpellCastFinished(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_hodir::UpdateAI(), boss_mimiron::UpdateAI(), npc_ulduar_expedition_engineer::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
21142{
21143 // Check target exists
21144 if (!who)
21145 return false;
21146 // Search in threat list
21147 ObjectGuid guid = who->GetGUID();
21148 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21149 {
21150 HostileReference* ref = (*i);
21151 // Return true if the unit matches
21152 if (ref && ref->getUnitGuid() == guid)
21153 return true;
21154 }
21155 // Nothing found, false.
21156 return false;
21157}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:277

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21371{
21372 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21373 {
21374 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21375 {
21376 return false;
21377 }
21378 }
21379
21380 if (ShapeshiftForm form = GetShapeshiftForm())
21381 {
21382 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21383 if (!shapeshift)
21384 {
21385 return true;
21386 }
21387
21388 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21389 {
21390 return true;
21391 }
21392 }
21393
21395 {
21396 return false;
21397 }
21398
21399 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21400 if (!display)
21401 {
21402 return true;
21403 }
21404
21406 if (!displayExtra)
21407 {
21408 return true;
21409 }
21410
21411 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21412 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21413
21414 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21415 {
21416 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21417 {
21418 return true;
21419 }
21420 }
21421
21422 return false;
21423}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition SharedDefines.h:417
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1947
bool HasFlag(ChrRacesFlags flag) const
Definition DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition DBCStructure.h:725
uint32 DisplayRaceID
Definition DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition DBCStructure.h:804
uint32 flags1
Definition DBCStructure.h:1822

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

References HasUnitState(), and UNIT_STATE_IN_FLIGHT.

Referenced by Player::CheckAreaExploreAndOutdoor(), Spell::CheckCast(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), go_commandscript::DoTeleport(), go_commandscript::DoTeleportToTransport(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectLeap(), Spell::EffectStuck(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), Player::GetNPCIfCanInteractWith(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLogoutRequestOpcode(), Battlefield::HandlePlayerEnterZone(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), Battlefield::InvitePlayerToWar(), Player::IsFalling(), Player::IsOutdoorPvPActive(), IsValidCombatTarget(), item_only_for_flight::OnUse(), WorldSession::ProcessMovementInfo(), Player::ProcessTerrainStatusUpdate(), SetStunned(), Player::TeleportTo(), and Player::UpdatePvPState().

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4240{
4241 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4242}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition UnitDefines.h:335

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
19033{
19034 if (this == unit)
19035 return true;
19036
19037 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19038 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19039 if (u1 == u2)
19040 return true;
19041
19042 if (u1->IsPlayer() && u2->IsPlayer())
19043 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
19044 // Xinef: we assume that npcs with the same faction are in party
19045 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19046 return u1->GetFaction() == u2->GetFaction();
19047 // Xinef: creature type_flag should work for party check only if player group is not a raid
19050 return true;
19051 else
19052 return false;
19053}
bool isRaidGroup() const
Definition Group.cpp:2281
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2295

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
19056{
19057 if (this == unit)
19058 return true;
19059
19060 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19061 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19062 if (u1 == u2)
19063 return true;
19064
19065 if (u1->IsPlayer() && u2->IsPlayer())
19066 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
19067 // Xinef: we assume that npcs with the same faction are in party
19068 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19069 return u1->GetFaction() == u2->GetFaction();
19072 return true;
19073 else
19074 return false;
19075}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4216{
4217 // can always move when not casting
4219 {
4220 return false;
4221 }
4222
4223 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4225 {
4226 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4227 {
4228 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4229 {
4230 return false;
4231 }
4232 }
4233 }
4234
4235 // prohibit movement for all other spell casts
4236 return true;
4237}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10445{
10446 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10447 if (!my_faction || !my_faction->faction)
10448 return true;
10449
10450 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10451 if (raw_faction && raw_faction->reputationListID >= 0)
10452 return false;
10453
10454 return my_faction->IsNeutralToAll();
10455}
bool IsNeutralToAll() const
Definition DBCStructure.h:984

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4147{
4148 // We don't do loop here to explicitly show that melee spell is excluded.
4149 // Maybe later some special spells will be excluded too.
4150
4151 // generic spells are cast when they are not finished and not delayed
4154 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4155 {
4156 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4157 {
4158 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4159 return true;
4160 }
4161 }
4162 // channeled spells may be delayed, but they are still considered cast
4163 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4165 {
4166 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4167 return true;
4168 }
4169 // autorepeat spells may be finished or delayed, but they are still considered cast
4170 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4171 return true;
4172
4173 return false;
4174}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition SharedDefines.h:484

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
787{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), ChaseMovementGenerator< T >::DispatchSplineToPosition(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), UpdateSpeed(), and UpdateSplinePosition().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17590{
17591 Unit* owner = GetOwner();
17592
17593 if (!owner || !owner->IsPlayer())
17594 return false;
17595
17596 // if the owner has that pet aura, return true
17597 for (PetAura const* petAura : owner->m_petAuras)
17598 if (petAura->GetAura(GetEntry()) == aura->GetId())
17599 return true;
17600
17601 return false;
17602}
Definition SpellMgr.h:463
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16983{
16984 uint32 transformId = getTransForm();
16985 if (!transformId)
16986 return false;
16987
16988 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16989 if (!spellInfo)
16990 return false;
16991
16992 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16993}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2029

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1299 {
1300 if (Unit* u = GetCharm())
1301 return u->isPossessed();
1302 else
1303 return false;
1304 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1305{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition Unit.h:1296

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:320

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsRooted()

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5959{
5961 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5962 {
5963 if ((*i)->GetMiscValue() == script)
5964 if ((*i)->IsAffectedOnSpell(spell))
5965 return (*i);
5966 }
5967 return nullptr;
5968}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16944{
16945 uint8 s = getStandState();
16946 return
16950}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3135{
3136 // These spells can't be blocked
3137 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3138 return false;
3139
3140 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3141 {
3142 // Check creatures flags_extra for disable block
3143 if (victim->IsCreature() &&
3145 return false;
3146
3147 float blockChance = victim->GetUnitBlockChance();
3148 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3149
3150 // xinef: cant block while casting or while stunned
3151 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3152 blockChance = 0.0f;
3153
3154 if (roll_chance_f(blockChance))
3155 return true;
3156 }
3157 return false;
3158}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:414
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:215
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1792
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3811
float GetUnitBlockChance() const
Definition Unit.cpp:3727

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStandUpOnMovementState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline
1742{ return !(HasUnitState(UNIT_STATE_MOVING)); }
@ UNIT_STATE_MOVING
Definition UnitDefines.h:214

References HasUnitState(), and UNIT_STATE_MOVING.

Referenced by RotateMovementGenerator::Initialize(), IdleMovementGenerator::Reset(), and SetFacingToObject().

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::JustDied(), boss_yoggsaron_influence_tentacle::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::SpellHit(), ToTempSummon(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17677{
17678 SpellInfo const* spellProto = aura->GetSpellInfo();
17679 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17680
17681 // let the aura be handled by new proc system if it has new entry
17682 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17683 return false;
17684
17685 // Get proc Event Entry
17686 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17687
17688 // Get EventProcFlag
17689 uint32 EventProcFlag;
17690 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17691 EventProcFlag = spellProcEvent->procFlags;
17692 else
17693 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17694 // Continue if no trigger exist
17695 if (!EventProcFlag)
17696 return false;
17697
17698 // Additional checks for triggered spells (ignore trap casts)
17699 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17700 {
17702 return false;
17703 }
17704
17705 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17706 // Xinef: skip victim auras
17707 // Excluded player shoot spells
17708 // Excluded player item spells
17709 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17710 {
17711 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17712 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17713 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17714 {
17715 return false;
17716 }
17717 }
17718
17719 // Check spellProcEvent data requirements
17720 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17721 return false;
17722 // In most cases req get honor or XP from kill
17723 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17724 {
17725 bool allow = false;
17726
17727 if (victim)
17728 allow = ToPlayer()->isHonorOrXPTarget(victim);
17729
17730 // Shadow Word: Death - can trigger from every kill
17731 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17732 allow = true;
17733 if (!allow)
17734 return false;
17735 }
17736 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17737 // But except periodic and kill triggers (can triggered from self)
17738 if (procSpell && procSpell->Id == spellProto->Id
17739 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17740 return false;
17741
17742 // Check if current equipment allows aura to proc
17743 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17744 {
17745 Player* player = ToPlayer();
17746 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17747 {
17748 Item* item = nullptr;
17749 if (attType == BASE_ATTACK)
17751 else if (attType == OFF_ATTACK)
17753 else
17755
17756 if (player->IsInFeralForm())
17757 return false;
17758
17759 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17760 return false;
17761 }
17762 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17763 {
17764 // Check if player is wearing shield
17766 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17767 return false;
17768 }
17769 }
17770 // Get chance from spell
17771 float chance = float(spellProto->ProcChance);
17772 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17773 if (spellProcEvent && spellProcEvent->customChance)
17774 chance = spellProcEvent->customChance;
17775 // If PPM exist calculate chance from PPM
17776 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17777 {
17778 uint32 attackSpeed = 0;
17779 Unit* attacker = nullptr;
17780 if (!isVictim)
17781 attacker = this;
17782 else if (victim)
17783 attacker = victim;
17784
17785 if (attacker)
17786 {
17787 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17788 {
17789 attackSpeed = attacker->GetAttackTime(attType);
17790 }
17791 else //spells user their casttime for ppm calculations
17792 {
17793 if (procSpell->CastTimeEntry)
17794 attackSpeed = procSpell->CastTimeEntry->CastTime;
17795
17796 //instants and fast spells use 1.5s castspeed
17797 if (attackSpeed < 1500)
17798 attackSpeed = 1500;
17799 }
17800 }
17801 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17802 }
17803
17804 // Custom chances
17805 switch (spellProto->SpellFamilyName)
17806 {
17808 {
17809 // Recklessness, allow to proc only once for whirlwind
17810 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17811 return false;
17812 }
17813 }
17814
17815 if (eventInfo.GetProcChance())
17816 {
17817 chance = *eventInfo.GetProcChance();
17818 }
17819
17820 // Apply chance modifer aura
17821 if (Player* modOwner = GetSpellModOwner())
17822 {
17823 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17824 }
17825
17826 return roll_chance_f(chance);
17827}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:679
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:505
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:530
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:135
@ PROC_FLAG_KILL
Definition SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:138
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1264
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12681
uint32 GetCategory() const
Definition SpellInfo.cpp:871
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:347
uint32 DmgClass
Definition SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition SpellInfo.cpp:1276
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13609
uint32 Class
Definition ItemTemplate.h:621
int32 CastTime
Definition DBCStructure.h:1760

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4401{
4403}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14177{
14178 return _IsValidAssistTarget(target, nullptr);
14179}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14182

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
14039{
14040 return _IsValidAttackTarget(target, bySpell);
14041}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1284
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:393

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
705{
706 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
707 return false;
708
709 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
710
711 return IsInDist(obj, objBoundaryRadius);
712}
float GetBoundaryRadius() const
Definition Unit.h:866
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:221

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const
650{
651 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
652 return false;
653
654 float dx = GetPositionX() - obj->GetPositionX();
655 float dy = GetPositionY() - obj->GetPositionY();
656 float dz = GetPositionZ() - obj->GetPositionZ();
657 float distsq = dx * dx + dy * dy + dz * dz;
658
659 float sizefactor = GetCombatReach() + obj->GetCombatReach();
660 float maxdist = dist2compare + sizefactor;
661
662 return distsq < maxdist * maxdist;
663}

References GetCombatReach(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by ArcherAI::AttackStart(), TurretAI::CanAIAttack(), Spell::CheckRange(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), spell_nightbane_fireball_barrage::FilterTargets(), SmartScript::GetTargets(), npc_underbat::JustEngagedWith(), DefaultTargetSelector::operator()(), SpellTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), ArcherAI::UpdateAI(), boss_flame_leviathan::UpdateAI(), and HostileReference::updateOnlineStatus().

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
678 maxdist += LEEWAY_BONUS_RANGE;
679
680 return distsq < maxdist * maxdist;
681}
#define LEEWAY_BONUS_RANGE
Definition ObjectDefines.h:51
bool HasLeewayMovement() const
Definition Unit.h:1709

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), SmartAI::DistanceYourself(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_thaddius::boss_thaddiusAI::IsAnyPlayerInMeleeRange(), boss_ouro::IsPlayerWithinMeleeRange(), ThreatContainer::IsPreferredTarget(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_overlord_drakuru_betrayal::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_kologarn::UpdateAI(), boss_razorscale::UpdateAI(), npc_ulduar_dark_rune_guardian::UpdateAI(), npc_ulduar_dark_rune_sentinel::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
690{
691 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
692 {
693 return false;
694 }
695
696 auto dx = GetPositionX() - obj->GetPositionX();
697 auto dy = GetPositionY() - obj->GetPositionY();
698 auto dz = GetPositionZ() - obj->GetPositionZ();
699 auto distsq = dx * dx + dy * dy + dz * dz;
700
701 return distsq <= dist * dist;
702}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19514{
19515 float angle = forward ? 0 : M_PI;
19516 if (IsCreature())
19517 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19518 else
19519 {
19520 float vcos = cos(angle + GetOrientation());
19521 float vsin = std::sin(angle + GetOrientation());
19522
19523 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19524 data << GetPackGUID();
19525 data << uint32(0); // Sequence
19526 data << float(vcos); // x direction
19527 data << float(vsin); // y direction
19528 data << float(speedXY); // Horizontal speed
19529 data << float(-speedZ); // Z Movement speed (vertical)
19530
19531 ToPlayer()->SendDirectMessage(&data);
19532 }
19533}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:636
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5685
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Object::IsCreature(), MotionMaster::MoveJumpTo(), Player::SendDirectMessage(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19536{
19537 float x, y, z;
19538 obj->GetContactPoint(this, x, y, z);
19539 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19540 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19541}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:254
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2779

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17970{
17971 // Prevent killing unit twice (and giving reward from kill twice)
17972 if (!victim->GetHealth())
17973 return;
17974
17975 if (killer && !killer->IsInMap(victim))
17976 killer = nullptr;
17977
17978 // find player: owner of controlled `this` or `this` itself maybe
17979 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17980 Creature* creature = victim->ToCreature();
17981
17982 bool isRewardAllowed = true;
17983 if (creature)
17984 {
17985 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17986 if (!isRewardAllowed)
17987 creature->SetLootRecipient(nullptr);
17988 }
17989
17990 // pussywizard: remade this if section (player is on the same map
17991 if (isRewardAllowed && creature)
17992 {
17993 Player* lr = creature->GetLootRecipient();
17994 if (lr && lr->IsInMap(creature))
17995 player = creature->GetLootRecipient();
17996 else if (Group* lrg = creature->GetLootRecipientGroup())
17997 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17998 if (Player* member = itr->GetSource())
17999 if (member->IsAtLootRewardDistance(creature))
18000 {
18001 player = member;
18002 break;
18003 }
18004 }
18005
18006 // Exploit fix
18007 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
18008 isRewardAllowed = false;
18009
18010 // Reward player, his pets, and group/raid members
18011 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
18012 if (isRewardAllowed && player && player != victim)
18013 {
18014 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
18015 data << player->GetGUID(); // player with killing blow
18016 data << victim->GetGUID(); // victim
18017
18018 Player* looter = player;
18019 Group* group = player->GetGroup();
18020 bool hasLooterGuid = false;
18021
18022 if (group)
18023 {
18024 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
18025
18026 if (creature)
18027 {
18028 group->UpdateLooterGuid(creature, true);
18029 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
18030 {
18031 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
18032 if (looter)
18033 {
18034 hasLooterGuid = true;
18035 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
18036 }
18037 }
18038 }
18039 }
18040 else
18041 {
18042 player->SendDirectMessage(&data);
18043
18044 if (creature)
18045 {
18046 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
18047 data2 << creature->GetGUID();
18048 data2 << uint8(0); // unk1
18049 data2 << uint8(0); // no group looter
18050 player->SendMessageToSet(&data2, true);
18051 }
18052 }
18053
18054 // Generate loot before updating looter
18055 if (creature)
18056 {
18057 Loot* loot = &creature->loot;
18058 loot->clear();
18059
18060 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
18061 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
18062
18063 if (creature->GetLootMode())
18065
18066 if (group)
18067 {
18068 if (hasLooterGuid)
18069 group->SendLooter(creature, looter);
18070 else
18071 group->SendLooter(creature, nullptr);
18072
18073 // Update round robin looter only if the creature had loot
18074 if (!creature->loot.empty())
18075 group->UpdateLooterGuid(creature);
18076 }
18077 }
18078
18079 player->RewardPlayerAndGroupAtKill(victim, false);
18080 }
18081
18082 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
18083 if (killer && (killer->IsPet() || killer->IsTotem()))
18084 if (Unit* owner = killer->GetOwner())
18085 {
18086 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18087 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
18088 }
18089
18090 if (killer != victim)
18091 {
18092 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18093 }
18094
18095 // Proc auras on death - must be before aura/combat remove
18096 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18097
18098 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
18099 // and before Spirit of Redemption as it also removes auras
18100 if (killer)
18101 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
18102 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
18103
18104 // Spirit of Redemption
18105 // if talent known but not triggered (check priest class for speedup check)
18106 bool spiritOfRedemption = false;
18108 {
18109 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
18110 {
18111 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
18112 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
18113 {
18114 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
18115 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
18116 victim->GetPositionY(), victim->GetPositionZ());
18117
18118 ACE_Stack_Trace trace(0, 50);
18119 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
18120 }
18121 else
18122 {
18123 // save value before aura remove
18124 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
18125 if (!ressSpellId)
18126 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
18127
18128 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
18129 victim->RemoveAllAurasOnDeath();
18130
18131 // Stop attacks
18132 victim->CombatStop();
18134
18135 // restore for use at real death
18136 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
18137
18138 // FORM_SPIRITOFREDEMPTION and related auras
18139 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
18140 spiritOfRedemption = true;
18141 }
18142 }
18143 }
18144
18145 if (!spiritOfRedemption)
18146 {
18147 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
18149 }
18150
18151 // Inform pets (if any) when player kills target)
18152 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
18153 // selection will get stuck on same target and break pet react state
18154 if (player)
18155 {
18156 Pet* pet = player->GetPet();
18157 if (pet && pet->IsAlive() && pet->isControlled())
18158 pet->AI()->KilledUnit(victim);
18159 }
18160
18161 // 10% durability loss on death
18162 // clean InHateListOf
18163 if (Player* plrVictim = victim->ToPlayer())
18164 {
18165 // remember victim PvP death for corpse type and corpse reclaim delay
18166 // at original death (not at SpiritOfRedemtionTalent timeout)
18167 plrVictim->SetPvPDeath(player != nullptr);
18168
18169 // only if not player and not controlled by player pet. And not at BG
18170 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
18171 {
18172 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
18173 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
18174 // durability lost message
18175 plrVictim->SendDurabilityLoss();
18176 }
18177 // Call KilledUnit for creatures
18178 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18179 killer->ToCreature()->AI()->KilledUnit(victim);
18180
18181 // last damage from non duel opponent or opponent controlled creature
18182 if (plrVictim->duel)
18183 {
18184 plrVictim->duel->Opponent->CombatStopWithPets(true);
18185 plrVictim->CombatStopWithPets(true);
18186 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18187 }
18188 }
18189 else // creature died
18190 {
18191 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18192
18193 if (!creature->IsPet() && creature->GetLootMode() > 0)
18194 {
18195 creature->GetThreatMgr().ClearAllThreat();
18196
18197 // must be after setDeathState which resets dynamic flags
18198 if (!creature->loot.isLooted())
18199 {
18201 }
18202 else
18203 {
18204 creature->AllLootRemovedFromCorpse();
18205 }
18206 }
18207
18208 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18209 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18210 killer->ToCreature()->AI()->KilledUnit(victim);
18211
18212 // Call creature just died function
18213 if (CreatureAI* ai = creature->AI())
18214 {
18215 ai->JustDied(killer);
18216 }
18217
18218 if (TempSummon* summon = creature->ToTempSummon())
18219 {
18220 if (WorldObject* summoner = summon->GetSummoner())
18221 {
18222 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18223 {
18224 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18225 }
18226 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18227 {
18228 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18229 }
18230 }
18231 }
18232
18233 // Dungeon specific stuff, only applies to players killing creatures
18234 if (creature->GetInstanceId())
18235 {
18236 Map* instanceMap = creature->GetMap();
18237 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18239
18240 if (instanceMap->IsDungeon() && player)
18241 if (instanceMap->IsRaidOrHeroicDungeon())
18243 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18244 }
18245 }
18246
18247 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18248 // handle player kill only if not suicide (spirit of redemption for example)
18249 if (player && killer != victim)
18250 {
18251 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18252 pvp->HandleKill(player, victim);
18253
18254 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18255 bf->HandleKill(player, victim);
18256 }
18257
18258 //if (victim->IsPlayer())
18259 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18260 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18261
18262 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18263 if (player)
18264 if (Battleground* bg = player->GetBattleground())
18265 {
18266 if (victim->IsPlayer())
18267 bg->HandleKillPlayer(victim->ToPlayer(), player);
18268 else
18269 bg->HandleKillUnit(victim->ToCreature(), player);
18270 }
18271
18272 // achievement stuff
18273 if (killer && victim->IsPlayer())
18274 {
18275 if (killer->IsCreature())
18277 else if (victim != killer && killer->IsPlayer())
18279 }
18280
18281 // Hook for OnPVPKill Event
18282 if (killer)
18283 {
18284 if (Player* killerPlr = killer->ToPlayer())
18285 {
18286 if (Player* killedPlr = victim->ToPlayer())
18287 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18288 else if (Creature* killedCre = victim->ToCreature())
18289 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18290 }
18291 else if (Creature* killerCre = killer->ToCreature())
18292 {
18293 if (Player* killed = victim->ToPlayer())
18294 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18295 }
18296 }
18297
18298 sScriptMgr->OnUnitDeath(victim, killer);
18299}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:474
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3361
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3868
@ PROC_FLAG_KILLED
Definition SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:481
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition WorldConfig.h:25
Definition Battlefield.h:205
Definition CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:132
Loot loot
Definition Creature.h:228
uint16 GetLootMode() const
Definition Creature.h:242
void AllLootRemovedFromCorpse()
Definition Creature.cpp:2954
bool IsLootRewardDisabled() const
Definition Creature.h:364
Player * GetLootRecipient() const
Definition Creature.cpp:1267
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3675
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1274
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2394
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2331
LootMethod GetLootMethod() const
Definition Group.cpp:2326
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:967
void PermBindAllPlayers()
Definition Map.cpp:2195
Definition Map.h:163
bool IsRaidOrHeroicDungeon() const
Definition Map.h:298
InstanceMap * ToInstanceMap()
Definition Map.h:378
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
TeamId GetTeamId(bool original=false) const
Definition Player.h:2125
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12194
uint32 GetResurrectionSpellId()
Definition Player.cpp:12624
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12525
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12738
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5475
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5676
uint32 GetInstanceId() const
Definition Object.h:509
uint32 GetZoneId() const
Definition Object.cpp:3082
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:227
uint32 maxgold
Definition CreatureData.h:228
uint32 lootid
Definition CreatureData.h:220
Definition LootMgr.h:313
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368
void clear()
Definition LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::DamageTaken(), boss_yoggsaron_brain::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), instance_nexus::instance_nexus_InstanceMapScript::KillAllFrayers(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1219{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::Explode(), npc_raging_flames::FixateRandomTarget(), spell_chapter2_persuasive_strike::HandleHit(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_wild_wyrm::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19402{
19403 Player* player = ToPlayer();
19404 if (!player)
19405 {
19406 if (Unit* charmer = GetCharmer())
19407 {
19408 player = charmer->ToPlayer();
19409 if (player && player->m_mover != this)
19410 player = nullptr;
19411 }
19412 }
19413
19414 if (!player)
19415 {
19416 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19417 }
19418 else
19419 {
19420 float vcos, vsin;
19421 GetSinCos(x, y, vsin, vcos);
19422
19423 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19424 data << GetPackGUID();
19425 data << player->GetSession()->GetOrderCounter(); // movement counter
19426 data << float(vcos); // x direction
19427 data << float(vsin); // y direction
19428 data << float(speedXY); // Horizontal speed
19429 data << float(-speedZ); // Z Movement speed (vertical)
19430
19431 player->SendDirectMessage(&data);
19432 player->GetSession()->IncrementOrderCounter();
19433
19434 player->SetCanKnockback(true);
19435 }
19436}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:607
SafeUnitPointer m_mover
Definition Player.h:2366
void SetCanKnockback(bool value)
Definition Player.h:2533
WorldSession * GetSession() const
Definition Player.h:2017
uint32 GetOrderCounter() const
Definition WorldSession.h:619
void IncrementOrderCounter()
Definition WorldSession.h:620
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:99

References GetCharmer(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), WorldSession::IncrementOrderCounter(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), Player::SendDirectMessage(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3362{
3363 // Can`t miss on dead target (on skinning for example)
3364 if (!victim->IsAlive() && !victim->IsPlayer())
3365 return SPELL_MISS_NONE;
3366
3367 // vehicles cant miss
3368 if (IsVehicle())
3369 return SPELL_MISS_NONE;
3370
3371 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3372 // resist and deflect chances
3373 // xinef: skip all calculations, proof: Toxic Tolerance quest
3374 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3375 return SPELL_MISS_NONE;
3376
3377 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3378 {
3379 return SPELL_MISS_NONE;
3380 }
3381
3382 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3383 int32 thisLevel = getLevelForTarget(victim);
3384 if (IsCreature() && ToCreature()->IsTrigger())
3385 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3386 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3387
3388 int32 MISS_CHANCE_MULTIPLIER;
3389 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3390 {
3391 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3392 }
3393 else
3394 {
3395 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3396 victim->IsPlayer()
3399 }
3400
3401 // Base hit chance from attacker and victim levels
3402 int32 modHitChance = levelDiff < 3
3403 ? 96 - levelDiff
3404 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3405
3406 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3407 if (Player* modOwner = GetSpellModOwner())
3408 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3409
3410 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3412
3413 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3414 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3415 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3416 {
3417 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3419 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3420 if (spellInfo->IsAffectingArea())
3421 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3422
3423 // Decrease hit chance from victim rating bonus
3424 if (victim->IsPlayer())
3425 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3426 }
3427
3428 int32 HitChance = modHitChance * 100;
3429 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3430 // Xinef: Totems should inherit casters ratings?
3431 if (IsTotem())
3432 {
3433 if (Unit* owner = GetOwner())
3434 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3435 }
3436 else
3437 HitChance += int32(m_modSpellHitChance * 100.0f);
3438
3439 if (HitChance < 100)
3440 HitChance = 100;
3441 else if (HitChance > 10000)
3442 HitChance = 10000;
3443
3444 int32 tmp = 10000 - HitChance;
3445
3446 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3447
3448 if (rand < tmp)
3449 return SPELL_MISS_MISS;
3450
3451 // Chance resist mechanic (select max value from every mechanic spell effect)
3452 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3453 tmp += resist_chance;
3454
3455 // Chance resist debuff
3456 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3457 {
3458 bool bNegativeAura = true;
3459 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3460 {
3461 // Xinef: Check if effect exists!
3462 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3463 {
3464 bNegativeAura = false;
3465 break;
3466 }
3467 }
3468
3469 if (bNegativeAura)
3470 {
3471 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3472 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3473 }
3474
3475 // Players resistance for binary spells
3476 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3477 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3478 }
3479
3480 // Roll chance
3481 if (rand < tmp)
3482 return SPELL_MISS_RESIST;
3483
3484 // cast by caster in front of victim
3485 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3486 {
3487 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3488 tmp += deflect_chance;
3489 if (rand < tmp)
3490 return SPELL_MISS_DEFLECT;
3491 }
3492
3493 return SPELL_MISS_NONE;
3494}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition SharedDefines.h:677
@ SPELL_MISS_NONE
Definition SharedDefines.h:1530
@ SPELL_MISS_RESIST
Definition SharedDefines.h:1532
@ SPELL_MISS_MISS
Definition SharedDefines.h:1531
@ SPELL_MISS_DEFLECT
Definition SharedDefines.h:1539
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:237
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition WorldConfig.h:132
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition WorldConfig.h:489
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition WorldConfig.h:488
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5191
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6223
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6213
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3167

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13250{
13251 if (!victim || pdamage == 0)
13252 return 0;
13253
13254 if (IsCreature())
13255 {
13256 // Dancing Rune Weapon...
13257 if (GetEntry() == 27893)
13258 {
13259 if (Unit* owner = GetOwner())
13260 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13261 }
13262 }
13263
13264 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13265
13266 // Done fixed damage bonus auras
13267 int32 DoneFlatBenefit = 0;
13268
13269 // ..done
13270 DoneFlatBenefit += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, creatureTypeMask);
13271
13272 // ..done
13273 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13274
13275 // ..done (base at attack power for marked target and base at attack power for creature type)
13276 int32 APbonus = 0;
13277
13278 if (attType == RANGED_ATTACK)
13279 {
13280 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13281
13282 // ..done (base at attack power and creature type)
13284 }
13285 else
13286 {
13287 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13288
13289 // ..done (base at attack power and creature type)
13291 }
13292
13293 if (APbonus != 0) // Can be negative
13294 {
13295 bool normalized = false;
13296 if (spellProto)
13297 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13298 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13299 {
13300 normalized = true;
13301 break;
13302 }
13303 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13304 }
13305
13306 // Done total percent damage auras
13307 float DoneTotalMod = 1.0f;
13308
13309 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13310 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13311 {
13312 // Some spells don't benefit from pct done mods
13313 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [spellProto, this, damageSchoolMask](AuraEffect const* aurEff)
13314 {
13315 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)))
13316 {
13317 if ((aurEff->GetMiscValue() & damageSchoolMask))
13318 {
13319 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
13320 return true;
13321 else if (!aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (aurEff->GetSpellInfo()->EquippedItemSubClassMask == 0))
13322 return true;
13323 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
13324 return true;
13325 }
13326 }
13327 return false;
13328 });
13329 }
13330
13331 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, [creatureTypeMask, spellProto, this](AuraEffect const* aurEff)
13332 {
13333 return (creatureTypeMask & aurEff->GetMiscValue() && (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)));
13334 });
13335
13336 // bonus against aurastate
13337 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, [victim, spellProto, this](AuraEffect const* aurEff)
13338 {
13339 return (victim->HasAuraState(AuraStateType(aurEff->GetMiscValue())) && (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)));
13340 });
13341
13342 // done scripted mod (take it from owner)
13343 Unit* owner = GetOwner() ? GetOwner() : this;
13344 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13345 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13346 {
13347 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13348 continue;
13349
13350 if (!(*i)->IsAffectedOnSpell(spellProto))
13351 continue;
13352
13353 switch ((*i)->GetMiscValue())
13354 {
13355 // Tundra Stalker
13356 // Merciless Combat
13357 case 7277:
13358 {
13359 // Merciless Combat
13360 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13361 {
13362 if (!victim->HealthAbovePct(35))
13363 AddPct(DoneTotalMod, (*i)->GetAmount());
13364 }
13365 // Tundra Stalker
13366 else
13367 {
13368 // Frost Fever (target debuff)
13369 if (victim->HasAura(55095))
13370 AddPct(DoneTotalMod, (*i)->GetAmount());
13371 }
13372 break;
13373 }
13374 // Rage of Rivendare
13375 case 7293:
13376 {
13377 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13378 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13379 break;
13380 }
13381 // Marked for Death
13382 case 7598:
13383 case 7599:
13384 case 7600:
13385 case 7601:
13386 case 7602:
13387 {
13388 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13389 AddPct(DoneTotalMod, (*i)->GetAmount());
13390 break;
13391 }
13392 // Dirty Deeds
13393 case 6427:
13394 case 6428:
13395 {
13396 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13397 {
13398 // effect 0 has expected value but in negative state
13399 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13400 AddPct(DoneTotalMod, bonus);
13401 }
13402 break;
13403 }
13404 }
13405 }
13406
13407 // Custom scripted damage
13408 if (spellProto)
13409 switch (spellProto->SpellFamilyName)
13410 {
13412 // Glacier Rot
13413 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13415 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13416 AddPct(DoneTotalMod, aurEff->GetAmount());
13417 break;
13418 }
13419
13420 // Some spells don't benefit from done mods
13421 if (spellProto)
13422 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13423 {
13424 DoneFlatBenefit = 0;
13425 DoneTotalMod = 1.0f;
13426 }
13427
13428 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13429
13430 // apply spellmod to Done damage
13431 if (spellProto)
13432 if (Player* modOwner = GetSpellModOwner())
13433 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13434
13435 // bonus result can be negative
13436 return uint32(std::max(tmpDamage, 0.0f));
13437}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:910
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:533
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17471
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1422

References SpellInfo::Effects, GetAPMultiplier(), GetCreatureTypeMask(), Object::GetEntry(), GetOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13440{
13441 if (pdamage == 0)
13442 return 0;
13443
13444 int32 TakenFlatBenefit = 0;
13445
13446 // ..taken
13447 TakenFlatBenefit += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_TAKEN, damageSchoolMask);
13448
13449 if (attType != RANGED_ATTACK)
13451 else
13453
13454 // Taken total percent damage auras
13455 float TakenTotalMod = 1.0f;
13456
13458
13459 // .. taken pct (special attacks)
13460 if (spellProto)
13461 {
13462 // From caster spells
13463 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, [attacker, spellProto](AuraEffect const* aurEff)
13464 {
13465 return attacker->GetGUID() == aurEff->GetCasterGUID() && aurEff->IsAffectedOnSpell(spellProto);
13466 });
13467
13468 // Mod damage from spell mechanic
13469 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13470
13471 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13472 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13473 mechanicMask |= (1 << MECHANIC_BLEED);
13474
13475 if (mechanicMask)
13476 {
13477 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, [mechanicMask](AuraEffect const* aurEff) -> bool
13478 {
13479 if (mechanicMask & uint32(1 << (aurEff->GetMiscValue())))
13480 return true;
13481 return false;
13482 });
13483 }
13484 }
13485
13486 TakenTotalMod = processDummyAuras(TakenTotalMod);
13487
13488 // .. taken pct: class scripts
13489 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13490 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13491 {
13492 switch ((*i)->GetMiscValue())
13493 {
13494 }
13495 }*/
13496
13497 if (attType != RANGED_ATTACK)
13498 {
13500 }
13501 else
13502 {
13504 }
13505
13506 // No positive taken bonus, custom attr
13507 if (spellProto)
13508 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13509 {
13510 TakenFlatBenefit = 0;
13511 TakenTotalMod = 1.0f;
13512 }
13513
13514 // xinef: sanctified wrath talent
13515 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13516 {
13517 float ignoreModifier = 1.0f - TakenTotalMod;
13518 bool addModifier = false;
13520 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13521 if ((*j)->GetMiscValue() & damageSchoolMask)
13522 {
13523 ApplyPct(ignoreModifier, (*j)->GetAmount());
13524 addModifier = true;
13525 }
13526
13527 if (addModifier)
13528 TakenTotalMod += ignoreModifier;
13529 }
13530
13531 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13532
13533 // bonus result can be negative
13534 return uint32(std::max(tmpDamage, 0.0f));
13535}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition Unit.cpp:12110
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1808

References ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), AuraEffect::IsAffectedOnSpell(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3189{
3190 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3191 // resist and deflect chances
3192 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3193 return SPELL_MISS_NONE;
3194
3195 WeaponAttackType attType = BASE_ATTACK;
3196
3197 // Check damage class instead of attack type to correctly handle judgements
3198 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3199 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3200 attType = RANGED_ATTACK;
3201
3202 int32 attackerWeaponSkill;
3203 // skill value for these spells (for example judgements) is 5* level
3204 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3205 attackerWeaponSkill = GetLevel() * 5;
3206 // bonus from skills is 0.04% per skill Diff
3207 else
3208 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3209
3210 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3211
3212 uint32 roll = urand (0, 10000);
3213
3214 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3215 // Roll miss
3216 uint32 tmp = missChance;
3217 if (roll < tmp)
3218 return SPELL_MISS_MISS;
3219
3220 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3221 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3222 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3223
3224 // Same spells cannot be parry/dodge
3225 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3226 return SPELL_MISS_NONE;
3227
3228 // Chance resist mechanic
3229 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3230 tmp += resist_chance;
3231 if (roll < tmp)
3232 return SPELL_MISS_RESIST;
3233
3234 // Ranged attacks can only miss, resist and deflect
3235 if (attType == RANGED_ATTACK)
3236 {
3237 // only if in front
3238 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3239 {
3240 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3241 tmp += deflect_chance;
3242 if (roll < tmp)
3243 return SPELL_MISS_DEFLECT;
3244 }
3245
3246 canDodge = false;
3247 canParry = false;
3248 }
3249
3250 // Check for attack from behind
3251 // xinef: if from behind or spell requires cast from behind
3252 if (!victim->HasInArc(M_PI, this))
3253 {
3254 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3255 {
3256 // Can`t dodge from behind in PvP (but its possible in PvE)
3257 if (victim->IsPlayer())
3258 {
3259 canDodge = false;
3260 }
3261
3262 // Can`t parry or block
3263 canParry = false;
3264 canBlock = false;
3265 }
3266 }
3267
3268 // Check creatures flags_extra for disable parry
3269 if (victim->IsCreature())
3270 {
3271 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3272 // Xinef: no dodge flag
3273 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3274 canDodge = false;
3275 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3276 canParry = false;
3277 // Check creatures flags_extra for disable block
3278 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3279 canBlock = false;
3280 }
3281 // Ignore combat result aura
3283 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3284 {
3285 if (!(*i)->IsAffectedOnSpell(spellInfo))
3286 continue;
3287 switch ((*i)->GetMiscValue())
3288 {
3289 case MELEE_HIT_DODGE:
3290 canDodge = false;
3291 break;
3292 case MELEE_HIT_BLOCK:
3293 canBlock = false;
3294 break;
3295 case MELEE_HIT_PARRY:
3296 canParry = false;
3297 break;
3298 default:
3299 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3300 break;
3301 }
3302 }
3303
3304 if (canDodge)
3305 {
3306 // Roll dodge
3307 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3308 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3310 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3311 // Reduce dodge chance by attacker expertise rating
3312 if (IsPlayer())
3313 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3314 else
3316
3317 // xinef: cant dodge while casting or while stunned
3318 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3319 dodgeChance = 0;
3320
3321 tmp += dodgeChance;
3322 if (roll < tmp)
3323 return SPELL_MISS_DODGE;
3324 }
3325
3326 if (canParry)
3327 {
3328 // Roll parry
3329 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3330 // Reduce parry chance by attacker expertise rating
3331 if (IsPlayer())
3332 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3333 else
3335
3336 // xinef: cant parry while casting or while stunned
3337 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3338 parryChance = 0;
3339
3340 tmp += parryChance;
3341 if (roll < tmp)
3342 return SPELL_MISS_PARRY;
3343 }
3344
3345 if (canBlock)
3346 {
3347 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3348
3349 // xinef: cant block while casting or while stunned
3350 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3351 blockChance = 0;
3352
3353 tmp += blockChance;
3354 if (roll < tmp)
3355 return SPELL_MISS_BLOCK;
3356 }
3357
3358 return SPELL_MISS_NONE;
3359}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition SharedDefines.h:676
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition SharedDefines.h:675
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition SharedDefines.h:507
@ SPELL_MISS_PARRY
Definition SharedDefines.h:1534
@ SPELL_MISS_DODGE
Definition SharedDefines.h:1533
@ SPELL_MISS_BLOCK
Definition SharedDefines.h:1535
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition SpellInfo.h:193
float GetUnitDodgeChance() const
Definition Unit.cpp:3665
float GetUnitParryChance() const
Definition Unit.cpp:3682
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19246
uint32 flags_extra
Definition CreatureData.h:242

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19247{
19248 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19249 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19250 {
19251 return 0.0f;
19252 }
19253
19254 //calculate miss chance
19255 float missChance = victim->GetUnitMissChance(attType);
19256
19257 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19258 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19259 {
19260 missChance += 19;
19261 }
19262
19263 // bonus from skills is 0.04%
19264 //miss_chance -= skillDiff * 0.04f;
19265 int32 diff = -skillDiff;
19266 if (victim->IsPlayer())
19267 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19268 else
19269 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19270
19271 // Calculate hit chance
19272 float hitChance = 100.0f;
19273
19274 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19275 if (spellId)
19276 {
19277 if (Player* modOwner = GetSpellModOwner())
19278 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19279 }
19280
19281 missChance -= hitChance - 100.0f;
19282
19283 if (attType == RANGED_ATTACK)
19284 missChance -= m_modRangedHitChance;
19285 else
19286 missChance -= m_modMeleeHitChance;
19287
19288 // Limit miss chance from 0 to 60%
19289 if (missChance < 0.0f)
19290 return 0.0f;
19291 if (missChance > 60.0f)
19292 return 60.0f;
19293 return missChance;
19294}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10708{
10709 if (apply)
10710 {
10711 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10712 {
10713 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10714 Unit::AuraMap& tAuras = GetOwnedAuras();
10715 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10716 {
10717 if ((*itr).second->IsRemoved())
10718 continue;
10719
10720 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10721 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10722 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10723 }
10724 }
10725 }
10726 else
10727 {
10728 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10729 {
10730 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10731
10732 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10733 {
10734 Unit::AuraMap& tAuras = GetOwnedAuras();
10735 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10736 {
10737 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10738 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10739 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10740 }
10741 }
10742 }
10743 }
10744}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1320
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:827
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:842
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:660
AuraMap & GetOwnedAuras()
Definition Unit.h:1358

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14274{
14275 int32 gain = 0;
14276
14277 if (dVal == 0)
14278 return 0;
14279
14280 int32 curHealth = (int32)GetHealth();
14281
14282 int32 val = dVal + curHealth;
14283 if (val <= 0)
14284 {
14285 SetHealth(0);
14286 return -curHealth;
14287 }
14288
14289 int32 maxHealth = (int32)GetMaxHealth();
14290
14291 if (val < maxHealth)
14292 {
14293 SetHealth(val);
14294 gain = val - curHealth;
14295 }
14296 else if (curHealth != maxHealth)
14297 {
14298 SetHealth(maxHealth);
14299 gain = maxHealth - curHealth;
14300 }
14301
14302 return gain;
14303}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14332{
14333 if (dVal == 0)
14334 return 0;
14335
14336 int32 gain = 0;
14337
14338 int32 curPower = (int32)GetPower(power);
14339
14340 int32 val = dVal + curPower;
14341 if (val <= 0)
14342 {
14343 SetPower(power, 0, withPowerUpdate);
14344 return -curPower;
14345 }
14346
14347 int32 maxPower = (int32)GetMaxPower(power);
14348
14349 if (val < maxPower)
14350 {
14351 SetPower(power, val, withPowerUpdate);
14352 gain = val - curPower;
14353 }
14354 else if (curPower != maxPower)
14355 {
14356 SetPower(power, maxPower, withPowerUpdate);
14357 gain = maxPower - curPower;
14358 }
14359
14360 if (GetAI())
14361 {
14362 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14363 }
14364
14365 return gain;
14366}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15810

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:311

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
15088{
15089 if (!spellInfo || castTime < 0)
15090 return;
15091
15092 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15093 return;
15094
15095 // called from caster
15096 if (Player* modOwner = GetSpellModOwner())
15098 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15099
15100 switch (spellInfo->DmgClass)
15101 {
15103 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15104 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15105 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15106 castTime = 500;
15107 break;
15109 break; // no known cases
15111 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15112 break;
15114 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15115 break;
15116 default:
15117 break;
15118 }
15119}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:591
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1572

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14988{
14989 // don't mod permanent auras duration
14990 if (duration < 0)
14991 return duration;
14992
14993 // some auras are not affected by duration modifiers
14994 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14995 return duration;
14996
14997 // cut duration only of negative effects
14998 // xinef: also calculate self casts, spell can be reflected for example
14999 if (!positive)
15000 {
15001 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
15002
15003 int32 durationMod;
15004 int32 durationMod_always = 0;
15005 int32 durationMod_not_stack = 0;
15006
15007 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
15008 {
15009 if (!(mechanic & 1 << i))
15010 continue;
15011
15012 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
15013 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
15014 continue;
15015
15016 // Find total mod value (negative bonus)
15017 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
15018 // Find max mod (negative bonus)
15019 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
15020 // Check if mods applied before were weaker
15021 if (new_durationMod_always < durationMod_always)
15022 durationMod_always = new_durationMod_always;
15023 if (new_durationMod_not_stack < durationMod_not_stack)
15024 durationMod_not_stack = new_durationMod_not_stack;
15025 }
15026
15027 // Select strongest negative mod
15028 if (durationMod_always > durationMod_not_stack)
15029 durationMod = durationMod_not_stack;
15030 else
15031 durationMod = durationMod_always;
15032
15033 if (durationMod != 0)
15034 AddPct(duration, durationMod);
15035
15036 // there are only negative mods currently
15037 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
15038 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
15039
15040 durationMod = 0;
15041 if (durationMod_always > durationMod_not_stack)
15042 durationMod += durationMod_not_stack;
15043 else
15044 durationMod += durationMod_always;
15045
15046 if (durationMod != 0)
15047 AddPct(duration, durationMod);
15048 }
15049 else
15050 {
15051 // else positive mods here, there are no currently
15052 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
15053 }
15054
15055 // Glyphs which increase duration of selfcasted buffs
15056 if (target == this)
15057 {
15058 switch (spellProto->SpellFamilyName)
15059 {
15060 case SPELLFAMILY_DRUID:
15061 if (spellProto->SpellFamilyFlags[0] & 0x100)
15062 {
15063 // Glyph of Thorns
15064 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15065 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15066 }
15067 break;
15069 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15070 {
15071 // Glyph of Blessing of Might
15072 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15073 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15074 }
15075 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15076 {
15077 // Glyph of Blessing of Wisdom
15078 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15079 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15080 }
15081 break;
15082 }
15083 }
15084 return std::max(duration, 0);
15085}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:653
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1367
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1338
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, AuraEffect::GetAmount(), GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

void Unit::MonsterMoveWithSpeed ( float  x,
float  y,
float  z,
float  speed 
)
531{
532 Movement::MoveSplineInit init(this);
533 init.MoveTo(x, y, z);
534 init.SetVelocity(speed);
535 init.Launch();
536}

References Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetVelocity().

Referenced by CinematicMgr::UpdateCinematicLocation().

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13624{
13625 if (mount)
13627
13629
13630 if (Player* player = ToPlayer())
13631 {
13632 sScriptMgr->AnticheatSetUnderACKmount(player);
13633
13634 // mount as a vehicle
13635 if (VehicleId)
13636 {
13637 if (CreateVehicleKit(VehicleId, creatureEntry))
13638 {
13639 GetVehicleKit()->Reset();
13640
13641 // Send others that we now have a vehicle
13643 data << GetPackGUID();
13644 data << uint32(VehicleId);
13645 SendMessageToSet(&data, true);
13646
13648 player->SendDirectMessage(&data);
13649
13650 // mounts can also have accessories
13652 }
13653 }
13654
13655 // unsummon pet
13656 Pet* pet = player->GetPet();
13657 if (pet)
13658 {
13660 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13661 if (bg && bg->isArena())
13663 else
13664 player->UnsummonPetTemporaryIfAny();
13665 }
13666
13667 // xinef: if we have charmed npc, stun him also
13668 if (Unit* charm = player->GetCharm())
13669 if (charm->IsCreature())
13670 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13671
13672 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13673 data << GetPackGUID();
13674 data << player->GetSession()->GetOrderCounter(); // movement counter
13675 data << player->GetCollisionHeight();
13676 player->SendDirectMessage(&data);
13677 player->GetSession()->IncrementOrderCounter();
13678 }
13679
13681}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18973
void Reset(bool evading=false)
Definition Vehicle.cpp:121
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:88

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19971{
19972 DisableSpline();
19973 if (IsPlayer())
19974 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19975 else
19976 {
19977 Position pos = {x, y, z, orientation};
19978 SendTeleportPacket(pos);
19979 UpdatePosition(x, y, z, orientation, true);
19982 }
19983}
@ TELE_TO_WITH_PET
Definition Player.h:821
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:820
@ TELE_TO_SPELL
Definition Player.h:819
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:817
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:818
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:816
void ReinitializeMovement()
Definition MotionMaster.cpp:940
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1353
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19992
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19388
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:20011

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19966{
19967 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19968}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19965

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::UpdateAI(), boss_yoggsaron_sara::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20221{
20222 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20223 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20224 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20226 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20227 if (IsInWorld())
20228 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20229
20230 LOG_INFO("entities.unit", "Summon Slot: ");
20231 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20232 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20233 LOG_INFO("server.loading", " ");
20234
20235 LOG_INFO("entities.unit", "Controlled List: ");
20236 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20237 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20238 LOG_INFO("server.loading", " ");
20239
20240 LOG_INFO("entities.unit", "Aura List: ");
20241 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20242 LOG_INFO("entities.unit", "{}, ", itr->first);
20243 LOG_INFO("server.loading", " ");
20244
20245 if (IsVehicle())
20246 {
20247 LOG_INFO("entities.unit", "Passenger List: ");
20248 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20249 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20250 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20251 LOG_INFO("server.loading", " ");
20252 }
20253
20254 if (GetVehicle())
20255 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20256}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:57

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20947{
20948 Creature const* creature = ToCreature();
20949
20950 // UNIT_NPC_FLAGS
20951 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20952 {
20953 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20954
20955 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20956 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20957
20958 if (!target->CanSeeSpellClickOn(creature))
20959 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20960
20961 if (!target->CanSeeVendor(creature))
20962 {
20963 appendValue &= ~UNIT_NPC_FLAG_REPAIR;
20964 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20965 }
20966
20967 if (!target->CanSeeTrainer(creature))
20968 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20969
20970 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20971 }
20972
20973 // UNIT_FIELD_AURASTATE
20974 if (posPointers.UnitFieldAuraStatePos >= 0)
20975 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20976
20977 // UNIT_FIELD_FLAGS
20978 if (posPointers.UnitFieldFlagsPos >= 0)
20979 {
20980 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20981 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20982 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20983
20984 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20985 }
20986
20987 // UNIT_FIELD_DISPLAYID
20988 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20989 if (posPointers.UnitFieldDisplayPos >= 0)
20990 {
20992 if (creature)
20993 {
20994 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20995
20996 // this also applies for transform auras
20997 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20998 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20999 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
21000 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
21001 {
21002 cinfo = transformInfo;
21003 break;
21004 }
21005
21007 {
21008 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
21009 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
21010 else
21011 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
21012 }
21013 }
21014
21015 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
21016 }
21017
21018 // UNIT_DYNAMIC_FLAGS
21019 // Hide lootable animation for unallowed players.
21020 if (posPointers.UnitDynamicFlagsPos >= 0)
21021 {
21023
21024 if (creature)
21025 {
21026 if (creature->hasLootRecipient())
21027 {
21028 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
21029 if (creature->isTappedBy(target))
21030 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
21031 }
21032
21033 if (!target->isAllowedToLoot(creature))
21034 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
21035 }
21036
21037 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
21038 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
21040 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
21041
21042 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
21043 }
21044
21045 // UNIT_FIELD_BYTES_2
21046 if (posPointers.UnitFieldBytes2Pos >= 0)
21047 {
21048 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
21049 {
21051 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21052 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21053 // Allow targetting opposite faction in party when enabled in config
21054 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
21055 }// pussywizard / Callmephil
21056 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21057 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
21058 {
21059 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
21060 }
21061 }
21062
21063 // UNIT_FIELD_FACTIONTEMPLATE
21064 if (posPointers.UnitFieldFactionTemplatePos >= 0)
21065 {
21066 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
21067 {
21069 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21070 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21071 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
21072 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21073 }// pussywizard / Callmephil
21074 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21075 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
21076 {
21077 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21078 }
21079 else if (target->IsGMSpectator() && IsControlledByPlayer())
21080 {
21081 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21082 }
21083 }
21084
21085 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
21086}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3362
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:341
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1342
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5682
bool CanSeeTrainer(Creature const *creature) const
Definition Player.cpp:14408
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14392
bool IsGMSpectator() const
Definition Player.h:1179
bool IsSpectator() const
Definition Player.h:2607
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14302
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10746
bool IsGMAccount() const
Definition WorldSession.cpp:206
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:154
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:164

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeTrainer(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16895{
16896 if (slot >= MAX_MOTION_SLOT)
16897 return;
16898
16899 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16900 movementGenerator->Pause(timer);
16901
16902 StopMoving();
16903}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16875

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20331{
20332 CharmInfo* charmInfo = GetCharmInfo();
20333 if (!charmInfo || !IsCreature())
20334 return;
20335
20336 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20337 {
20338 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20339 if (Unit* owner = GetOwner())
20340 {
20341 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20342 {
20343 AttackStop();
20344 charmInfo->SetIsAtStay(false);
20345 charmInfo->SetIsCommandAttack(true);
20346 charmInfo->SetIsReturning(false);
20347 charmInfo->SetIsFollowing(false);
20348
20349 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20350 }
20351 else if (owner->IsValidAttackTarget(target))
20352 {
20353 AttackStop();
20354 charmInfo->SetIsAtStay(false);
20355 charmInfo->SetIsCommandAttack(true);
20356 charmInfo->SetIsReturning(false);
20357 charmInfo->SetIsFollowing(false);
20358
20359 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20360 ToCreature()->AI()->AttackStart(target);
20361 else
20362 GetMotionMaster()->MoveChase(target);
20363 }
20364 }
20365
20366 // can be extended in future
20367 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20368 {
20369 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20370 charmInfo->SetForcedTargetGUID(target->GetGUID());
20371 }
20372 else
20373 {
20374 charmInfo->SetForcedSpell(0);
20376 }
20377 }
20378}
#define sDisableMgr
Definition DisableMgr.h:88
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1057
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:1007
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:314
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:446
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6612{
6613 // Not much to do if no flags are set.
6614 if (procAttacker && actor)
6615 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6616 // Now go on with a victim's events'n'auras
6617 // Not much to do if no flags are set or there is no victim
6618 if (victim && victim->IsAlive() && procVictim)
6619 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6620}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16285{
16286 // Player is loaded now - do not allow passive spell casts to proc
16287 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16288 return;
16289 // For melee/ranged based attack need update skills and set some Aura states if victim present
16290 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16291 {
16292 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16293 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16294 return;
16295
16296 // Update skills here for players
16297 // only when you are not fighting other players or their pets/totems (pvp)
16298 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16299 {
16300 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16302 {
16303 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16304 }
16305 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16306 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16307 {
16308 ToPlayer()->UpdateCombatSkills(target, attType, true);
16309 }
16310 }
16311 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16313 {
16314 // for victim
16315 if (isVictim)
16316 {
16317 // if victim and dodge attack
16318 if (procExtra & PROC_EX_DODGE)
16319 {
16320 // Update AURA_STATE on dodge
16321 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16322 {
16325 }
16326 }
16327 // if victim and parry attack
16328 if (procExtra & PROC_EX_PARRY)
16329 {
16330 // For Hunters only Counterattack (skip Mongoose bite)
16332 {
16335 }
16336 else
16337 {
16340 }
16341 }
16342 // if and victim block attack
16343 if (procExtra & PROC_EX_BLOCK)
16344 {
16347 }
16348 }
16349 else // For attacker
16350 {
16351 // Overpower on victim dodge
16352 if (procExtra & PROC_EX_DODGE)
16353 {
16355 {
16356 AddComboPoints(target, 1);
16358 }
16359 }
16360
16361 // Wolverine Bite
16362 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16363 {
16364 AddComboPoints(target, 1);
16366 }
16367 }
16368 }
16369 }
16370
16371 Unit* actor = isVictim ? target : this;
16372 Unit* actionTarget = !isVictim ? target : this;
16373
16374 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16375
16376 ProcTriggeredList procTriggered;
16377 // Fill procTriggered list
16378 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16379 {
16380 // Do not allow auras to proc from effect triggered by itself
16381 if (procAura && procAura->Id == itr->first)
16382 continue;
16383
16384 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16385 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16386 continue;
16387
16388 ProcTriggeredData triggerData(itr->second->GetBase());
16389 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16390 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16391 if (isVictim)
16392 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16393
16394 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16395
16396 // only auras that have trigger spell should proc from fully absorbed damage
16397 if (procExtra & PROC_EX_ABSORB && isVictim)
16398 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16399 active = true;
16400
16401 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16402 // only player spells are taken into account
16403 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16404 active = true;
16405
16406 // AuraScript Hook
16407 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16408 {
16409 continue;
16410 }
16411
16412 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16413
16414 // AuraScript Hook
16415 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16416 {
16417 continue;
16418 }
16419
16420 // do checks using conditions table
16421 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16422 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16423 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16424 {
16425 continue;
16426 }
16427
16428 bool hasTriggeredProc = false;
16429 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16430 {
16431 if (itr->second->HasEffect(i))
16432 {
16433 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16434
16435 // Skip this auras
16436 if (isNonTriggerAura[aurEff->GetAuraType()])
16437 continue;
16438
16439 // If not trigger by default and spellProcEvent == nullptr - skip
16440 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16441 continue;
16442
16443 switch (aurEff->GetAuraType())
16444 {
16447 case SPELL_AURA_DUMMY:
16449 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16450 {
16451 triggerData.triggerSpelId[i] = triggerSpellId;
16452 hasTriggeredProc = true;
16453 }
16454 break;
16455 default:
16456 break;
16457 }
16458
16459 // Some spells must always trigger
16460 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16461 triggerData.effMask |= 1 << i;
16462 }
16463 }
16464
16465 if (triggerData.effMask)
16466 {
16467 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16468 if (hasTriggeredProc)
16469 {
16470 bool proccessed = false;
16471 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16472 {
16473 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16474 {
16475 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16476 if (iter != procTriggered.end())
16477 {
16478 std::advance(iter, 1);
16479 procTriggered.insert(iter, triggerData);
16480 proccessed = true;
16481 break;
16482 }
16483 }
16484 }
16485
16486 if (!proccessed)
16487 {
16488 procTriggered.push_front(triggerData);
16489 }
16490 }
16491 else
16492 {
16493 procTriggered.push_front(triggerData);
16494 }
16495 }
16496 }
16497
16498 // Nothing found
16499 if (procTriggered.empty())
16500 return;
16501
16502 // Note: must SetCantProc(false) before return
16504 SetCantProc(true);
16505
16506 // Handle effects proceed this time
16507 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16508 {
16509 // look for aura in auras list, it may be removed while proc event processing
16510 if (i->aura->IsRemoved())
16511 continue;
16512
16513 bool useCharges = i->aura->IsUsingCharges();
16514 // no more charges to use, prevent proc
16515 if (useCharges && !i->aura->GetCharges())
16516 continue;
16517
16518 bool takeCharges = false;
16519 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16520
16521 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16522
16523 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16524
16525 // For players set spell cooldown if need
16526 uint32 cooldown = 0;
16527 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16528 cooldown = i->spellProcEvent->cooldown;
16529
16530 // Xinef: set cooldown for actual proc
16531 eventInfo.SetProcCooldown(cooldown);
16532
16533 // Note: must SetCantProc(false) before return
16535 SetCantProc(true);
16536
16537 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16538
16539 // "handled" is needed as long as proc can be handled in multiple places
16540 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16541 {
16542 uint32 Id = i->aura->GetId();
16543 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16544 takeCharges = true;
16545 }
16546
16547 if (!handled)
16548 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16549 {
16550 if (!(i->effMask & (1 << effIndex)))
16551 continue;
16552
16553 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16554 ASSERT(triggeredByAura);
16555
16556 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16557 if (prevented)
16558 {
16559 takeCharges = true;
16560 continue;
16561 }
16562
16563 switch (triggeredByAura->GetAuraType())
16564 {
16566 {
16567 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16568 // Don`t drop charge or add cooldown for not started trigger
16569 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16570 takeCharges = true;
16571 break;
16572 }
16574 {
16575 // target has to be valid
16576 if (!eventInfo.GetProcTarget())
16577 break;
16578
16579 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16580 takeCharges = true;
16581 break;
16582 }
16584 case SPELL_AURA_DUMMY:
16585 {
16586 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16587 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16588 takeCharges = true;
16589 break;
16590 }
16595 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16596 takeCharges = true;
16597 break;
16599 {
16600 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16601 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16602 takeCharges = true;
16603 break;
16604 }
16606 {
16607 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16608 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16609 if (damage > 0)
16610 {
16612 takeCharges = true;
16613 }
16614 break;
16615 }
16617 {
16618 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16619 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16620 HandleAuraRaidProcFromCharge(triggeredByAura);
16621 takeCharges = true;
16622 break;
16623 }
16625 {
16626 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16627
16628 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16629 takeCharges = true;
16630 break;
16631 }
16633 // Skip melee hits or instant cast spells
16634 // xinef: check channeled spells which are affected by haste also
16635 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16636 (procSpellInfo->CalcCastTime() > 0 /*||
16637 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16638 takeCharges = true;
16639 break;
16641 // Skip Melee hits and spells ws wrong school
16642 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16643 takeCharges = true;
16644 break;
16646 // Skip Melee hits and targets with magnet aura
16647 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16648 takeCharges = true;
16649 break;
16652 // Skip melee hits and spells ws wrong school or zero cost
16653 if (procSpellInfo &&
16654 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16655 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16656 takeCharges = true;
16657 break;
16660 // Compare mechanic
16661 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16662 takeCharges = true;
16663 break;
16665 // Compare casters
16666 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16667 takeCharges = true;
16668 break;
16669 // CC Auras which use their amount amount to drop
16670 // Are there any more auras which need this?
16676 {
16677 // Spell own direct damage at apply wont break the CC
16678 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16679 if (procSpellInfo)
16680 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16681 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16682 break;
16683
16684 // chargeable mods are breaking on hit
16685 if (useCharges)
16686 takeCharges = true;
16687 else if (triggeredByAura->GetAmount()) // aura must have amount
16688 {
16689 int32 damageLeft = triggeredByAura->GetAmount();
16690 // No damage left
16691 if (damageLeft < int32(damage))
16692 i->aura->Remove();
16693 else
16694 triggeredByAura->SetAmount(damageLeft - damage);
16695 }
16696 break;
16697 }
16699 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16700 break;
16701 takeCharges = true;
16702 break;
16705 {
16706 if (triggeredByAura->GetSpellModifier())
16707 {
16708 // Do proc if mod is consumed by spell
16709 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16710 {
16711 takeCharges = true;
16712 }
16713 }
16714 break;
16715 }
16716 default:
16717 takeCharges = true;
16718 break;
16719 }
16720 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16721 }
16722 // Remove charge (aura can be removed by triggers)
16723 // xinef: take into account attribute6 of proc spell
16724 if (prepare && useCharges && takeCharges)
16725 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16726 i->aura->DropCharge();
16727
16728 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16729
16731 SetCantProc(false);
16732 }
16733
16734 // Cleanup proc requirements
16736 SetCantProc(false);
16737}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:149
@ EFFECT_2
Definition SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition SharedDefines.h:523
#define EFFECT_ALL
Definition SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition SharedDefines.h:620
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition SpellMgr.h:218
@ PROC_FLAG_DONE_PERIODIC
Definition SpellMgr.h:134
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:107
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:105
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:16084
@ REACTIVE_OVERPOWER
Definition Unit.h:610
@ REACTIVE_DEFENSE
Definition Unit.h:608
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:609
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:611
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7271
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1031
Definition Unit.h:427
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:461
Unit * GetActionTarget() const
Definition Unit.h:447
Unit * GetProcTarget() const
Definition Unit.h:448
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:9143
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17829
bool IsHunterPet() const
Definition Unit.h:788
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17676
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8948
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1321
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6822
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1834
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:10046
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17918
Definition Unit.cpp:16065

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
12111{
12112 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
12113 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
12114
12115 // .. taken pct: dummy auras
12116 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
12117 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
12118 {
12119 if (!(*i) || !(*i)->GetSpellInfo())
12120 {
12121 continue;
12122 }
12123
12124 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
12125 {
12126 switch (spellIconId)
12127 {
12128 // Cheat Death
12129 case 2109:
12130 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
12131 {
12132 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
12133 // is 22.5% critical strike damage reduction, or 444 resilience.
12134 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12135 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12136 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12137 }
12138 break;
12139 }
12140 }
12141 }
12142 return TakenTotalMod;
12143}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4311{
4314}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4316
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1164

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4317{
4318 if (IsCreature())
4320
4321 if (IsFlying() || (!IsControlledByPlayer()))
4322 return;
4323
4324 LiquidData const& liquidData = GetLiquidData();
4325
4326 // remove appropriate auras if we are swimming/not swimming respectively - exact mirror of client logic
4327 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING && (liquidData.Level - GetPositionZ()) > GetCollisionHeight() * 0.75f) // Shallow water at ~75% of collision height)
4329 else
4331
4332 // liquid aura handling
4333 LiquidTypeEntry const* curLiquid = nullptr;
4334 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4335 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4336
4337 if (curLiquid != _lastLiquid)
4338 {
4341
4342 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4343 _lastLiquid = curLiquid;
4344
4346 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4347 CastSpell(this, curLiquid->SpellId, true);
4348 }
4349}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3269
bool IsFlying() const
Definition Unit.h:1693
Definition GridTerrainData.h:199
float Level
Definition GridTerrainData.h:204
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1283
uint32 SpellId
Definition DBCStructure.h:1289

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCollisionHeight(), WorldObject::GetLiquidData(), Position::GetPositionZ(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), LiquidData::Level, MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1569{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:926

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16996{
16998 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16999 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
17000 SetObjectScale(std::max(scale, scaleMin));
17001}
@ SPELL_AURA_MOD_SCALE_2
Definition SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition Object.h:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1951

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10695{
10696 while (!m_attackers.empty())
10697 {
10698 AttackerSet::iterator iter = m_attackers.begin();
10699 if (!(*iter)->AttackStop())
10700 {
10701 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10702 m_attackers.erase(iter);
10703 }
10704 }
10705}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5446{
5447 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5448 // we want to have all auras removed, so use your brain when linking events
5449 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5450 {
5451 AuraApplicationMap::iterator aurAppIter;
5452 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5454
5455 AuraMap::iterator aurIter;
5456 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5457 RemoveOwnedAura(aurIter);
5458 }
5459}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::DoAction(), boss_yoggsaron_sara::DoAction(), boss_yoggsaron_cloud::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::EnterEvadeMode(), npc_ulduar_leviathan_mkii::EnterEvadeMode(), npc_ulduar_vx001::EnterEvadeMode(), npc_ulduar_aerial_command_unit::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_crystalline_frayer::EnterSeedPod(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::JustReachedHome(), boss_runemaster_molgeim::JustReachedHome(), boss_stormcaller_brundir::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), npc_crystalline_frayer::Reset(), boss_bjarngrim::Reset(), boss_loken::Reset(), boss_hodir::Reset(), boss_xt002::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5520{
5521 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5522 {
5523 Aura const* aura = iter->second->GetBase();
5524 if (aura->GetSpellInfo()->HasAura(type))
5525 ++iter;
5526 else
5528 }
5529
5530 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5531 {
5532 Aura* aura = iter->second;
5533 if (aura->GetSpellInfo()->HasAura(type))
5534 ++iter;
5535 else
5537 }
5538}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5476{
5477 // used just after dieing to remove all visible auras
5478 // and disable the mods for the passive ones
5479 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5480 {
5481 Aura const* aura = iter->second->GetBase();
5484 else
5485 ++iter;
5486 }
5487
5488 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5489 {
5490 Aura* aura = iter->second;
5493 else
5494 ++iter;
5495 }
5496}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:654
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1039

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5499{
5500 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5501 {
5502 Aura const* aura = iter->second->GetBase();
5503 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5505 else
5506 ++iter;
5507 }
5508
5509 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5510 {
5511 Aura* aura = iter->second;
5512 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5514 else
5515 ++iter;
5516 }
5517}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11303{
11304 // possessed pet and vehicle
11305 if (IsPlayer())
11307
11308 while (!m_Controlled.empty())
11309 {
11310 Unit* target = *m_Controlled.begin();
11311 m_Controlled.erase(m_Controlled.begin());
11312 if (target->GetCharmerGUID() == GetGUID())
11313 {
11314 target->RemoveCharmAuras();
11315 }
11316 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11317 {
11318 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11319 {
11320 target->ToTempSummon()->UnSummon();
11321 }
11322 }
11323 else
11324 {
11325 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11326 }
11327 }
11328}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9327
bool IsGuardian() const
Definition Unit.h:785
void RemoveCharmAuras()
Definition Unit.cpp:11410

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6398{
6399 while (!m_dynObj.empty())
6400 m_dynObj.front()->Remove();
6401}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6498{
6499 while(!m_gameObj.empty())
6500 {
6501 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6502 if (go)
6503 {
6505 go->SetRespawnTime(0);
6506 go->Delete();
6507 }
6508 m_gameObj.erase(m_gameObj.begin());
6509 }
6510}
void Delete()
Definition GameObject.cpp:962
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1268

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
11074{
11075 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
11076 {
11077 Unit* unit = *itr;
11078 ++itr;
11079 if (unit->GetEntry() == entry && unit->IsCreature()
11080 && unit->ToCreature()->IsSummon()) // minion, actually
11081 unit->ToTempSummon()->UnSummon();
11082 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
11083 }
11084}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4990{
4991 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4992 {
4993 if (check(iter->second))
4994 {
4995 RemoveAura(iter);
4996 continue;
4997 }
4998 ++iter;
4999 }
5000}

References m_appliedAuras, and RemoveAura().

Referenced by _RemoveNoStackAurasDueToAura(), and RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
5016{
5017 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5018 {
5019 if (check(iter->second))
5020 {
5021 RemoveAura(iter);
5022 continue;
5023 }
5024 ++iter;
5025 }
5026}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5413{
5414 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5415 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5416 {
5417 Aura* aura = iter->second;
5418 ++iter;
5419 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5420 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5421 {
5422 AuraApplication* aurApp = itr->second;
5423 ++itr;
5424 Unit* target = aurApp->GetTarget();
5425 if (target == this)
5426 continue;
5427 target->RemoveAura(aurApp);
5428 // things linked on aura remove may apply new area aura - so start from the beginning
5429 iter = m_ownedAuras.begin();
5430 }
5431 }
5432
5433 // remove area auras owned by others
5434 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5435 {
5436 if (iter->second->GetBase()->GetOwner() != this)
5437 {
5438 RemoveAura(iter);
5439 }
5440 else
5441 ++iter;
5442 }
5443}
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:182
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5462{
5463 // in join, remove positive buffs, on end, remove negative
5464 // used to remove positive visible auras in arenas
5465 RemoveAppliedAuras([](AuraApplication const* aurApp)
5466 {
5467 Aura const* aura = aurApp->GetBase();
5468 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5469 && !aura->IsPassive() // don't remove passive auras
5470 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5471 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5472 });
5473}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition SharedDefines.h:580
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition SharedDefines.h:524
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition SharedDefines.h:562
bool IsPositive() const
Definition SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Battleground::AddPlayer().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4969{
4970 if (aura->IsRemoved())
4971 return;
4972 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4973 RemoveAura(aurApp, mode);
4974}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4926{
4927 // we've special situation here, RemoveAura called while during aura removal
4928 // this kind of call is needed only when aura effect removal handler
4929 // or event triggered by it expects to remove
4930 // not yet removed effects of an aura
4931 if (aurApp->GetRemoveMode())
4932 {
4933 // remove remaining effects of an aura
4934 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4935 {
4936 if (aurApp->HasEffect(itr))
4937 aurApp->_HandleEffect(itr, false);
4938 }
4939 return;
4940 }
4941 // no need to remove
4942 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4943 return;
4944
4945 uint32 spellId = aurApp->GetBase()->GetId();
4946 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4947
4948 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4949 {
4950 if (aurApp == iter->second)
4951 {
4952 // Prevent Arena Preparation aura from being removed by player actions
4953 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4954 // Should only be removed by the arena script, once the match starts.
4956 {
4957 return;
4958 }
4959
4960 RemoveAura(iter, mode);
4961 return;
4962 }
4963 else
4964 ++iter;
4965 }
4966}
@ SPELL_AURA_ARENA_PREPARATION
Definition SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4896{
4897 AuraApplication* aurApp = i->second;
4898 // Do not remove aura which is already being removed
4899 if (aurApp->GetRemoveMode())
4900 return;
4901 Aura* aura = aurApp->GetBase();
4902 _UnapplyAura(i, mode);
4903 // Remove aura - for Area and Target auras
4904 if (aura->GetOwner() == this)
4905 aura->Remove(mode);
4906}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::DoAction(), boss_yoggsaron::DoAction(), boss_yoggsaron_crusher_tentacle::DoAction(), boss_yoggsaron_corruptor_tentacle::DoAction(), boss_yoggsaron_constrictor_tentacle::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_bloodspore_haze::HandleEffectHit(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), spell_handover_reins::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), IsHighestExclusiveAuraEffect(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), boss_loken::OnAuraRemove(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_sartharion::SendLavaWaves(), boss_anomalus::SetData(), boss_hodir::SmallIcicles(), boss_malygos::SpellHit(), npc_ulduar_iron_construct::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_thorims_hammer::UpdateAI(), boss_freya::UpdateAI(), boss_freya_elder_brightleaf::UpdateAI(), npc_ulduar_iron_construct::UpdateAI(), npc_ulduar_aerial_command_unit::UpdateAI(), boss_razorscale::UpdateAI(), boss_yoggsaron_sara::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4909{
4910 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4911 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4912 {
4913 Aura const* aura = iter->second->GetBase();
4914 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4915 && (!caster || aura->GetCasterGUID() == caster))
4916 {
4917 RemoveAura(iter, removeMode);
4918 return;
4919 }
4920 else
4921 ++iter;
4922 }
4923}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
5045{
5046 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5047 for (AuraMap::iterator iter = range.first; iter != range.second;)
5048 {
5049 Aura* aura = iter->second;
5050 if ((aura->GetType() == UNIT_AURA_TYPE)
5051 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5052 {
5053 aura->ModStackAmount(-1, removeMode);
5054 return;
5055 }
5056 else
5057 ++iter;
5058 }
5059}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:963
AuraObjectType GetType() const
Definition SpellAuras.cpp:420

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5397{
5398 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5399 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5400 {
5401 Aura const* aura = iter->second->GetBase();
5402 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5404 {
5405 RemoveAura(iter);
5406 continue;
5407 }
5408 ++iter;
5409 }
5410}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:1883

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5237{
5238 // simple check if list is empty
5239 if (m_modAuras[auraType].empty())
5240 return;
5241
5242 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5243 {
5244 Aura* aura = (*iter)->GetBase();
5246
5247 ++iter;
5248 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5249 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5250 {
5251 uint32 removedAuras = m_removedAurasCount;
5252 RemoveAura(aurApp);
5253 if (m_removedAurasCount > removedAuras)
5254 iter = m_modAuras[auraType].begin();
5255 }
5256 }
5257}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5212{
5213 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5214 {
5215 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5216 {
5217 RemoveAura(iter);
5218 iter = m_appliedAuras.lower_bound(spellId);
5219 }
5220 else
5221 ++iter;
5222 }
5223
5224 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5225 {
5226 if (iter->second->GetCastItemGUID() == castItemGuid)
5227 {
5229 iter = m_ownedAuras.lower_bound(spellId);
5230 }
5231 else
5232 ++iter;
5233 }
5234}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
5029{
5030 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5031 {
5032 Aura const* aura = iter->second->GetBase();
5033 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5034 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5035 {
5036 RemoveAura(iter, removeMode);
5037 iter = m_appliedAuras.lower_bound(spellId);
5038 }
5039 else
5040 ++iter;
5041 }
5042}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), Player::ApplyItemObtainSpells(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_wild_wyrm::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_eject_passenger_wild_wyrm::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_tenris_mirkblood::KilledUnit(), boss_felblood_kaelthas::LapseAction(), npc_crystalline_frayer::LeaveSeedPod(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), npc_wild_wyrm::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_anub_arak::SpellHitTarget(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anub_arak::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_freya_lifebinder::UpdateAI(), boss_freya_healthy_spore::UpdateAI(), boss_mimiron::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
5062{
5063 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5064 for (AuraMap::iterator iter = range.first; iter != range.second;)
5065 {
5066 Aura* aura = iter->second;
5067 if (aura->GetCasterGUID() == casterGUID)
5068 {
5069 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5070
5071 // Call OnDispel hook on AuraScript
5072 aura->CallScriptDispel(&dispelInfo);
5073
5075 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5076 else
5077 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5078
5079 // Call AfterDispel hook on AuraScript
5080 aura->CallScriptAfterDispel(&dispelInfo);
5081
5082 switch (aura->GetSpellInfo()->SpellFamilyName)
5083 {
5084 case SPELLFAMILY_HUNTER:
5085 {
5086 // Noxious Stings
5087 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5088 {
5089 if (Unit* caster = aura->GetCaster())
5090 {
5091 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5092 {
5093 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5094 {
5095 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5096 if (aura->GetUnitOwner())
5097 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5098 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5099 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5100 }
5101 }
5102 }
5103 }
5104 break;
5105 }
5107 {
5108 // Icy Clutch, remove with Frost Fever
5109 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5110 {
5111 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5112 RemoveAurasDueToSpell(aureff->GetId());
5113 }
5114 }
5115 default:
5116 break;
5117 }
5118 return;
5119 }
5120 else
5121 ++iter;
5122 }
5123}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2314
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:291
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.cpp:915
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2327
Definition Unit.h:303

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5126{
5127 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5128 for (AuraMap::iterator iter = range.first; iter != range.second;)
5129 {
5130 Aura* aura = iter->second;
5131 if (aura->GetCasterGUID() == casterGUID)
5132 {
5133 int32 damage[MAX_SPELL_EFFECTS];
5134 int32 baseDamage[MAX_SPELL_EFFECTS];
5135 uint8 effMask = 0;
5136 uint8 recalculateMask = 0;
5137 Unit* caster = aura->GetCaster();
5138 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5139 {
5140 if (aura->GetEffect(i))
5141 {
5142 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5143 damage[i] = aura->GetEffect(i)->GetAmount();
5144 effMask |= (1 << i);
5145 if (aura->GetEffect(i)->CanBeRecalculated())
5146 recalculateMask |= (1 << i);
5147 }
5148 else
5149 {
5150 baseDamage[i] = 0;
5151 damage[i] = 0;
5152 }
5153 }
5154
5156 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5157 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5158
5159 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5160 {
5161 if (stealCharge)
5162 oldAura->ModCharges(1);
5163 else
5164 oldAura->ModStackAmount(1);
5165 oldAura->SetDuration(int32(dur));
5166 }
5167 else
5168 {
5169 // single target state must be removed before aura creation to preserve existing single target aura
5170 if (aura->IsSingleTarget())
5171 aura->UnregisterSingleTarget();
5172
5173 // Xinef: if stealer has same aura
5174 Aura* curAura = stealer->GetAura(aura->GetId());
5175 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5176 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, stealer->GetGUID()))
5177 {
5178 // created aura must not be single target aura,, so stealer won't loose it on recast
5179 if (newAura->IsSingleTarget())
5180 {
5181 newAura->UnregisterSingleTarget();
5182 // bring back single target aura status to the old aura
5183 aura->SetIsSingleTarget(true);
5184 caster->GetSingleCastAuras().push_back(aura);
5185 }
5186 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5187 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5188
5189 // Reset periodic timers so stolen HoTs tick properly
5190 // For stolen auras we need fresh tick counters since no ticks have occurred yet
5191 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5192 if (AuraEffect* aurEff = newAura->GetEffect(i))
5193 aurEff->ResetPeriodic(true);
5194
5195 newAura->ApplyForTargets();
5196 }
5197 }
5198
5199 if (stealCharge)
5201 else
5203
5204 return;
5205 }
5206 else
5207 ++iter;
5208 }
5209}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1119
bool IsPermanent() const
Definition SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5260{
5261 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5262 {
5263 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5264 if (spell->Attributes & flags)
5265 RemoveAura(iter);
5266 else
5267 ++iter;
5268 }
5269}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5343{
5344 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5345 {
5346 Aura const* aura = iter->second->GetBase();
5347 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5348 {
5349 SpellInfo const* spell = aura->GetSpellInfo();
5350 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5351 {
5352 RemoveAura(iter);
5353 continue;
5354 }
5355 }
5356 ++iter;
5357 }
5358}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5308{
5309 if (!(m_interruptMask & flag))
5310 return;
5311
5312 // interrupt auras
5313 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5314 {
5315 Aura* aura = (*iter)->GetBase();
5316 ++iter;
5317 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5318 {
5319 uint32 removedAuras = m_removedAurasCount;
5320 RemoveAura(aura);
5321 if (m_removedAurasCount > removedAuras + 1)
5322 iter = m_interruptableAuras.begin();
5323 }
5324 }
5325
5326 // interrupt channeled spell
5328 {
5329 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5330 {
5331 // Do not interrupt if auto shot
5332 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5333 {
5334 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5335 }
5336 }
5337 }
5338
5340}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMoverRelocation(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5380{
5381 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5382 {
5383 Aura const* aura = iter->second->GetBase();
5384 if (!except || aura->GetId() != except)
5385 {
5386 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5387 {
5388 RemoveAura(iter, removemode);
5389 continue;
5390 }
5391 }
5392 ++iter;
5393 }
5394}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11406{
11408}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18811{
18812 if (!IsCharmed())
18813 return;
18814
18815 if (!charmer)
18816 charmer = GetCharmer();
18817 if (charmer != GetCharmer()) // one aura overrides another?
18818 {
18819 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18820 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18821 // ABORT();
18822 return;
18823 }
18824
18825 CharmType type;
18827 type = CHARM_TYPE_POSSESS;
18828 else if (charmer && charmer->IsOnVehicle(this))
18829 type = CHARM_TYPE_VEHICLE;
18830 else
18831 type = CHARM_TYPE_CHARM;
18832
18833 if (_oldFactionId)
18834 {
18836 _oldFactionId = 0;
18837 }
18838 else
18840
18841 CastStop();
18842 AttackStop();
18843
18844 // xinef: update speed after charming
18845 UpdateSpeed(MOVE_RUN, false);
18846
18847 // xinef: do not break any controlled motion slot
18848 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18849 {
18850 StopMoving();
18852 }
18853 // xinef: if we have any controlled movement, clear active and idle only
18854 else
18856
18858
18859 // xinef: remove stunned flag if owner was mounted
18862
18863 // If charmer still exists
18864 if (!charmer)
18865 return;
18866
18867 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18868 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18869
18870 charmer->SetCharm(this, false);
18871
18873
18874 Player* playerCharmer = charmer->ToPlayer();
18875 if (playerCharmer)
18876 {
18877 switch (type)
18878 {
18879 case CHARM_TYPE_VEHICLE:
18880 playerCharmer->SetClientControl(this, false);
18881 playerCharmer->SetClientControl(charmer, true); // verified
18884 break;
18885 case CHARM_TYPE_POSSESS:
18886 playerCharmer->SetClientControl(this, false);
18887 playerCharmer->SetClientControl(charmer, true); // verified
18892 break;
18893 case CHARM_TYPE_CHARM:
18895 {
18897 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18898 {
18900 if (GetCharmInfo())
18901 GetCharmInfo()->SetPetNumber(0, true);
18902 else
18903 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18904 }
18905 }
18906 break;
18907 default:
18908 break;
18909 }
18910 }
18911
18912 if (Player* player = ToPlayer())
18913 {
18914 sScriptMgr->AnticheatSetUnderACKmount(player);
18915 }
18916
18917 // xinef: restore threat
18918 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18919 {
18920 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18921 if (!IsFriendlyTo(target))
18922 AddThreat(target, itr->second);
18923 }
18924
18925 _charmThreatInfo.clear();
18926
18927 if (Creature* creature = ToCreature())
18928 {
18929 // Vehicle should not attack its passenger after he exists the seat
18930 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18931 if (Attack(charmer, true))
18932 GetMotionMaster()->MoveChase(charmer);
18933
18934 // Creature will restore its old AI on next update
18935 if (creature->AI())
18936 creature->AI()->OnCharmed(false);
18937
18938 // Xinef: Remove movement flag flying
18940 }
18941 else
18942 ToPlayer()->SetClientControl(this, true); // verified
18943
18944 // a guardian should always have charminfo
18945 if (playerCharmer && this != charmer->GetFirstControlled())
18946 playerCharmer->SendRemoveControlBar();
18947
18948 // xinef: Always delete charm info (restores react state)
18949 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18951}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2631
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:241
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:354
void InitDefault()
Definition MotionMaster.cpp:88
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:219
void MovementExpired(bool reset=true)
Definition MotionMaster.h:205
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:739
void SendRemoveControlBar()
Definition Player.cpp:9728
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12864
void DeleteCharmInfo()
Definition Unit.cpp:16049
void RestoreFaction()
Definition Unit.cpp:18953
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:11086
void StopAttackingInvalidTarget()
Definition Unit.cpp:20189
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1187
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10457
CharmThreatMap _charmThreatInfo
Definition Unit.h:2178
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:763
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14423
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
1009{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6376{
6377 if (m_dynObj.empty())
6378 return false;
6379
6380 bool result = false;
6381 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6382 {
6383 DynamicObject* dynObj = *i;
6384 if (dynObj->GetSpellId() == spellId)
6385 {
6386 dynObj->Remove();
6387 i = m_dynObj.begin();
6388 result = true;
6389 }
6390 else
6391 ++i;
6392 }
6393
6394 return result;
6395}
void Remove()
Definition DynamicObject.cpp:180

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5564{
5565 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5566 {
5567 Aura const* aura = iter->second->GetBase();
5568 SpellInfo const* spellInfo = aura->GetSpellInfo();
5570 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5571 ++iter;
5572 else
5574 }
5575
5576 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5577 {
5578 Aura* aura = iter->second;
5579 SpellInfo const* spellInfo = aura->GetSpellInfo();
5581 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5582 ++iter;
5583 else
5585 }
5586}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:455
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1874{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15927{
15928 // cleanup
15929 ASSERT(GetGUID());
15930
15931 if (IsInWorld())
15932 {
15934 if (IsVehicle())
15936
15940
15943
15944 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15947
15949
15950 if (GetCharmerGUID())
15951 {
15952 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15953 ABORT();
15954 }
15955
15956 if (Unit* owner = GetOwner())
15957 {
15958 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15959 {
15961 owner->SetMinion((Minion*)this, false);
15962 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15963 //ABORT();
15964 }
15965 }
15966
15969 }
15970}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5271
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11418
void RemoveAllDynObjects()
Definition Unit.cpp:6397
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5412
void RemoveBindSightAuras()
Definition Unit.cpp:11405
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11302
void RemoveFromWorld() override
Definition Object.cpp:1200

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6432{
6433 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6434 return;
6435
6437
6438 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6439 {
6440 if (m_ObjectSlot[i] == gameObj->GetGUID())
6441 {
6442 m_ObjectSlot[i].Clear();
6443 break;
6444 }
6445 }
6446
6447 // GO created by some spell
6448 if (uint32 spellid = gameObj->GetSpellId())
6449 {
6450 RemoveAurasDueToSpell(spellid);
6451
6452 if (IsPlayer())
6453 {
6454 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6455 // Need activate spell use for owner
6456 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6457 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6458 ToPlayer()->SendCooldownEvent(createBySpell);
6459 }
6460 }
6461
6462 m_gameObj.remove(gameObj->GetGUID());
6463
6464 if (del)
6465 {
6466 gameObj->SetRespawnTime(0);
6467 gameObj->Delete();
6468 }
6469}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11074

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::JustDied(), npc_ulduar_harpoonfirestate::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6472{
6473 if (m_gameObj.empty())
6474 return;
6475
6476 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6477 {
6478 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6479 {
6480 if (spellid > 0 && go->GetSpellId() != spellid)
6481 {
6482 ++itr;
6483 continue;
6484 }
6485
6486 go->SetOwnerGUID(ObjectGuid::Empty);
6487 if (del)
6488 {
6489 go->SetRespawnTime(0);
6490 go->Delete();
6491 }
6492 }
6493 m_gameObj.erase(itr++);
6494 }
6495}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
946{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5361{
5362 if (withRoot)
5364
5365 // Snares
5366 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5367 {
5368 Aura const* aura = iter->second->GetBase();
5370 {
5371 RemoveAura(iter);
5372 continue;
5373 }
5374
5375 ++iter;
5376 }
5377}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5272{
5273 // single target auras from other casters
5274 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5275 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5276 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5277 // leading to assertion failures if the aura was cast on a player that can
5278 // (and is changing map at the point where this function is called).
5279 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5280 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5281 // to register in m_appliedAuras
5282 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5283 {
5284 Aura const* aura = iter->second;
5285
5286 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5287 RemoveOwnedAura(iter);
5288 else
5289 ++iter;
5290 }
5291
5292 // single target auras at other targets
5293 AuraList& scAuras = GetSingleCastAuras();
5294 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5295 {
5296 Aura* aura = *iter;
5297 if (aura->GetUnitOwner() != this)
5298 {
5299 aura->Remove();
5300 iter = scAuras.begin();
5301 }
5302 else
5303 ++iter;
5304 }
5305}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
755{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::EndBattle(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), boss_flame_leviathan_overload_device::OnSpellClick(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::StartBattle(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4858{
4859 if (aura->IsRemoved())
4860 return;
4861
4862 ASSERT(aura->GetOwner() == this);
4863
4864 uint32 spellId = aura->GetId();
4865 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4866
4867 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4868 {
4869 if (itr->second == aura)
4870 {
4871 RemoveOwnedAura(itr, removeMode);
4872 return;
4873 }
4874 }
4875
4876 ABORT();
4877}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4825{
4826 Aura* aura = i->second;
4827 ASSERT(!aura->IsRemoved());
4828
4829 // if unit currently update aura list then make safe update iterator shift to next
4832
4833 m_ownedAuras.erase(i);
4834 m_removedAuras.push_back(aura);
4835
4836 // Unregister single target aura
4837 if (aura->IsSingleTarget())
4838 aura->UnregisterSingleTarget();
4839
4840 aura->_Remove(removeMode);
4841
4842 i = m_ownedAuras.begin();
4843}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:513

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4846{
4847 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4848 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4849 {
4850 RemoveOwnedAura(itr, removeMode);
4851 itr = m_ownedAuras.lower_bound(spellId);
4852 }
4853 else
4854 ++itr;
4855}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4977{
4978 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4979 {
4980 if (check(iter->second))
4981 {
4982 RemoveOwnedAura(iter);
4983 continue;
4984 }
4985 ++iter;
4986 }
4987}

References m_ownedAuras, and RemoveOwnedAura().

Referenced by _RemoveNoStackAurasDueToAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
5003{
5004 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5005 {
5006 if (check(iter->second))
5007 {
5008 RemoveOwnedAura(iter);
5009 continue;
5010 }
5011 ++iter;
5012 }
5013}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17563{
17564 if (!IsPlayer())
17565 return;
17566
17567 m_petAuras.erase(petSpell);
17568 if (Pet* pet = ToPlayer()->GetPet())
17569 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17570 if (Unit* charm = GetCharm())
17571 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17572}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11396{
11397 m_sharedVision.remove(player);
11398 player->m_isInSharedVisionOf.erase(this);
11399
11401 if (m_sharedVision.empty())
11402 setActive(false);
11403}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:912

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

739{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by at_hol_hall_of_watchers::_OnTrigger(), spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_hazzarah::JustSummoned(), npc_crystalline_frayer::LeaveSeedPod(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_sartharion_dragonAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::Reset(), boss_sartharion_dragonAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_flame_leviathan::Reset(), boss_mimiron::Reset(), npc_ulduar_leviathan_mkii::Reset(), boss_xt002::Reset(), boss_ingvar_the_plunderer::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), Player::SetBeastMaster(), SetCharm(), npc_ulduar_leviathan_mkii::SetData(), npc_ulduar_vx001::SetData(), npc_ulduar_aerial_command_unit::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::SpellHit(), npc_ulduar_leviathan_mkii::SpellHit(), npc_ulduar_vx001::SpellHit(), npc_ulduar_aerial_command_unit::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_flame_leviathan::UpdateAI(), boss_mimiron::UpdateAI(), boss_xt002::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18986{
18987 if (!m_vehicleKit)
18988 return;
18989
18991 delete m_vehicleKit;
18992
18993 m_vehicleKit = nullptr;
18994
18995 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18996 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18998}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:343
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:344
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:755

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1533{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17422

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), npc_wild_wyrm::DamageTaken(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
1022 {
1023 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1024 return entry->FactionRespondsToCallForHelp();
1025
1026 return false;
1027 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
17017{
17018 AuraEffect* handledAura = nullptr;
17019 AuraEffect* handledAuraForced = nullptr;
17020 // try to receive model from transform auras
17022 if (!transforms.empty())
17023 {
17024 // iterate over already applied transform auras - from newest to oldest
17025 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
17026 {
17027 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
17028 {
17029 if (!handledAura)
17030 handledAura = (*i);
17031 // xinef: prefer negative/forced auras
17032 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
17033 {
17034 handledAuraForced = (*i);
17035 break;
17036 }
17037 }
17038 }
17039 }
17040
17041 // Xinef: include clone auras (eg mirror images)
17042 if (!handledAuraForced && !handledAura)
17043 {
17045 if (!cloneAuras.empty())
17046 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
17047 handledAura = *i;
17048 }
17049
17051
17052 // xinef: order of execution is important!
17053 // first forced transform auras, then shapeshifts, then normal transform
17054 // transform aura was found
17055 if (handledAuraForced)
17056 {
17057 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17058 return;
17059 }
17060 else if (!shapeshiftAura.empty()) // we've found shapeshift
17061 {
17062 // only one such aura possible at a time
17063 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
17064 {
17065 SetDisplayId(modelId);
17066 return;
17067 }
17068 }
17069 else if (handledAura)
17070 {
17071 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17072 return;
17073 }
17074
17075 // no auras found - set modelid to default
17077}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:756
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition Unit.cpp:19456

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18954{
18955 if (IsPlayer())
18957 else
18958 {
18960 {
18961 if (Unit* owner = GetOwner())
18962 {
18963 SetFaction(owner->GetFaction());
18964 return;
18965 }
18966 }
18967
18968 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18969 SetFaction(cinfo->faction);
18970 }
18971}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5842

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16906{
16907 if (slot >= MAX_MOTION_SLOT)
16908 return;
16909
16910 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16911 movementGenerator->Resume(timer);
16912}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20123{
20124 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
20125 float addRage;
20126
20127 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20128
20129 // Unknown if correct, but lineary adjust rage conversion above level 70
20130 if (GetLevel() > 70)
20131 rageconversion += 13.27f * (GetLevel() - 70);
20132
20133 if (attacker)
20134 {
20135 // see Bornak's bluepost explanation (05/29/2009)
20136 float rageFromDamageDealt = damage / rageconversion * 7.5f;
20137 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
20138 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
20140 }
20141 else
20142 {
20143 addRage = damage / rageconversion * 2.5f;
20144
20145 // Berserker Rage effect
20146 if (HasAura(18499))
20147 addRage *= 3.0f;
20148 }
20149
20150 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20151
20152 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20153}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition WorldConfig.h:392

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2818{
2819 // This is only wrapper
2820
2821 // Miss chance based on melee
2822 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2823 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2824
2825 // Critical hit chance
2826 float crit_chance = GetUnitCriticalChance(attType, victim);
2827 if (crit_chance < 0)
2828 crit_chance = 0;
2829
2830 float dodge_chance = victim->GetUnitDodgeChance();
2831 float block_chance = victim->GetUnitBlockChance();
2832 float parry_chance = victim->GetUnitParryChance();
2833
2834 // Useful if want to specify crit & miss chances for melee, else it could be removed
2835 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2836
2837 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2838}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3753

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2841{
2842 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2843 {
2844 return MELEE_HIT_EVADE;
2845 }
2846
2847 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2848 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2849
2850 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2851 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2852
2853 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2854
2855 // bonus from skills is 0.04%
2856 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2857 int32 sum = 0, tmp = 0;
2858 int32 roll = urand (0, 10000);
2859
2860 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2861 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2862 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2863
2864 tmp = miss_chance;
2865
2866 if (tmp > 0 && roll < (sum += tmp))
2867 {
2868 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2869 return MELEE_HIT_MISS;
2870 }
2871
2872 // Dodge chance
2873
2874 // only players can't dodge if attacker is behind
2875 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2876 {
2877 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2878 }
2879 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2880 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2881 {
2882 // Reduce dodge chance by attacker expertise rating
2883 if (IsPlayer())
2884 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2885 else
2886 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2887
2888 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2890 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2891
2892 tmp = dodge_chance;
2893
2894 // xinef: if casting or stunned - cant dodge
2895 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2896 tmp = 0;
2897
2898 if ((tmp > 0) // check if unit _can_ dodge
2899 && ((tmp -= skillBonus) > 0)
2900 && roll < (sum += tmp))
2901 {
2902 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2903 return MELEE_HIT_DODGE;
2904 }
2905 }
2906
2907 // parry & block chances
2908
2909 // check if attack comes from behind, nobody can parry or block if attacker is behind
2910 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2911 {
2912 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2913 }
2914 else
2915 {
2916 // Reduce parry chance by attacker expertise rating
2917 if (IsPlayer())
2918 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2919 else
2920 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2921
2922 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2923 {
2924 tmp = parry_chance;
2925
2926 // xinef: cant parry while casting or while stunned
2927 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2928 tmp = 0;
2929
2930 if (tmp > 0 // check if unit _can_ parry
2931 && (tmp -= skillBonus) > 0
2932 && roll < (sum += tmp))
2933 {
2934 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2935 return MELEE_HIT_PARRY;
2936 }
2937 }
2938
2939 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2940 {
2941 tmp = block_chance;
2942
2943 // xinef: cant block while casting or while stunned
2944 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2945 tmp = 0;
2946
2947 if (tmp > 0 // check if unit _can_ block
2948 && (tmp -= skillBonus) > 0
2949 && roll < (sum += tmp))
2950 {
2951 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2952 return MELEE_HIT_BLOCK;
2953 }
2954 }
2955 }
2956
2957 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2958 if (attType != RANGED_ATTACK &&
2959 (IsPlayer() || IsPet()) &&
2960 !victim->IsPlayer() && !victim->IsPet() &&
2961 GetLevel() < victim->getLevelForTarget(this))
2962 {
2963 // cap possible value (with bonuses > max skill)
2964 int32 skill = attackerWeaponSkill;
2965 int32 maxskill = attackerMaxSkillValueForLevel;
2966 skill = (skill > maxskill) ? maxskill : skill;
2967
2968 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2969 tmp = tmp > 4000 ? 4000 : tmp;
2970 if (roll < (sum += tmp))
2971 {
2972 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2973 return MELEE_HIT_GLANCING;
2974 }
2975 }
2976
2977 // mobs can score crushing blows if they're 4 or more levels above victim
2978 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2979 // can be from by creature (if can) or from controlled player that considered as creature
2982 {
2983 // when their weapon skill is 15 or more above victim's defense skill
2984 tmp = victimDefenseSkill;
2985 int32 tmpmax = victimMaxSkillValueForLevel;
2986 // having defense above your maximum (from items, talents etc.) has no effect
2987 tmp = tmp > tmpmax ? tmpmax : tmp;
2988 // tmp = mob's level * 5 - player's current defense skill
2989 tmp = attackerMaxSkillValueForLevel - tmp;
2990 if (tmp >= 15)
2991 {
2992 // add 2% chance per lacking skill point, min. is 15%
2993 tmp = tmp * 200 - 1500;
2994 if (roll < (sum += tmp))
2995 {
2996 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2997 return MELEE_HIT_CRUSHING;
2998 }
2999 }
3000 }
3001
3002 // Critical chance
3003 tmp = crit_chance;
3004
3005 if (tmp > 0 && roll < (sum += tmp))
3006 {
3007 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3008 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3009 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3010 else
3011 return MELEE_HIT_CRIT;
3012 }
3013
3014 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3015 return MELEE_HIT_NORMAL;
3016}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21301{
21302 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21303}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17261{
17262 std::list<Unit*> targets;
17263 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17265 Cell::VisitObjects(this, searcher, dist);
17266
17267 // remove current target
17268 if (GetVictim())
17269 targets.remove(GetVictim());
17270
17271 if (exclude)
17272 targets.remove(exclude);
17273
17274 // remove not LoS targets
17275 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17276 {
17277 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17278 {
17279 std::list<Unit*>::iterator tIter2 = tIter;
17280 ++tIter;
17281 targets.erase(tIter2);
17282 }
17283 else
17284 ++tIter;
17285 }
17286
17287 // no appropriate targets
17288 if (targets.empty())
17289 return nullptr;
17290
17291 // select random
17293}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:14038
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:414

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17226{
17227 std::list<Unit*> targets;
17228 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17230 Cell::VisitObjects(this, searcher, dist);
17231
17232 // remove current target
17233 if (GetVictim())
17234 targets.remove(GetVictim());
17235
17236 if (exclude)
17237 targets.remove(exclude);
17238
17239 // remove not LoS targets
17240 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17241 {
17242 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17243 {
17244 std::list<Unit*>::iterator tIter2 = tIter;
17245 ++tIter;
17246 targets.erase(tIter2);
17247 }
17248 else
17249 ++tIter;
17250 }
17251
17252 // no appropriate targets
17253 if (targets.empty())
17254 return nullptr;
17255
17256 // select random
17258}
Definition GridNotifiers.h:852

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::UpdateAI(), npc_storm_beacon_spawn::UpdateAI(), boss_kologarn::UpdateAI(), boss_thorim_trap::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6713{
6714 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6715
6716 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6717 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6718 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6719 {
6720 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6721 tmpDamage[i] = damageInfo->damages[i].damage;
6722 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6723 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6724 {
6725 tmpAbsorb[i] = tmpDamage[i];
6726 tmpDamage[i] = 0;
6727 }
6728 }
6729
6730 uint32 count = 1;
6731 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6732 {
6733 ++count;
6734 }
6735
6736 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6737 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6738 data << uint32(damageInfo->HitInfo);
6739 data << damageInfo->attacker->GetPackGUID();
6740 data << damageInfo->target->GetPackGUID();
6741 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6742 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6743 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6744 data << uint8(count); // Sub damage count
6745
6746 for (uint32 i = 0; i < count; ++i)
6747 {
6748 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6749 data << float(tmpDamage[i]); // sub damage
6750 data << uint32(tmpDamage[i]); // Sub Damage
6751 }
6752
6754 {
6755 for (uint32 i = 0; i < count; ++i)
6756 {
6757 data << uint32(tmpAbsorb[i]); // Absorb
6758 }
6759 }
6760
6762 {
6763 for (uint32 i = 0; i < count; ++i)
6764 {
6765 data << uint32(damageInfo->damages[i].resist); // Resist
6766 }
6767 }
6768
6769 data << uint8(damageInfo->TargetState);
6770 data << uint32(0); // Unknown attackerstate
6771 data << uint32(0); // Melee spellid
6772
6773 if (damageInfo->HitInfo & HITINFO_BLOCK)
6774 data << uint32(damageInfo->blocked_amount);
6775
6776 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6777 data << uint32(0);
6778
6780 if (damageInfo->HitInfo & HITINFO_UNK1)
6781 {
6782 data << uint32(0);
6783 data << float(0);
6784 data << float(0);
6785 data << float(0);
6786 data << float(0);
6787 data << float(0);
6788 data << float(0);
6789 data << float(0);
6790 data << float(0);
6791 data << float(0); // Found in a loop with 1 iteration
6792 data << float(0); // ditto ^
6793 data << uint32(0);
6794 }
6795
6796 SendMessageToSet(&data, true);
6797}
@ HITINFO_RAGE_GAIN
Definition Unit.h:122
@ HITINFO_UNK1
Definition Unit.h:99
@ SMSG_ATTACKERSTATEUPDATE
Definition Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6800{
6801 CalcDamageInfo dmgInfo;
6802 dmgInfo.HitInfo = HitInfo;
6803 dmgInfo.attacker = this;
6804 dmgInfo.target = target;
6805
6806 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6807 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6808 dmgInfo.damages[0].absorb = AbsorbDamage;
6809 dmgInfo.damages[0].resist = Resist;
6810
6811 dmgInfo.damages[1].damage = 0;
6812 dmgInfo.damages[1].damageSchoolMask = 0;
6813 dmgInfo.damages[1].absorb = 0;
6814 dmgInfo.damages[1].resist = 0;
6815
6816 dmgInfo.TargetState = TargetState;
6817 dmgInfo.blocked_amount = BlockedAmount;
6818 SendAttackStateUpdate(&dmgInfo);
6819}
HitInfo
Definition Unit.h:97

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20085{
20086 if (!GetThreatMgr().isThreatListEmpty())
20087 {
20088 uint32 count = GetThreatMgr().GetThreatList().size();
20089
20090 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20091 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20092 data << GetPackGUID();
20093 data << pHostileReference->getUnitGuid().WriteAsPacked();
20094 data << uint32(count);
20096 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20097 {
20098 data << (*itr)->getUnitGuid().WriteAsPacked();
20099 data << uint32((*itr)->GetThreat() * 100);
20100 }
20101 SendMessageToSet(&data, false);
20102 }
20103}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20313{
20315 data << GetPackGUID();
20316 SendMessageToSet(&data, false);
20317}
@ SMSG_BREAK_TARGET
Definition Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20106{
20107 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20109 data << GetPackGUID();
20110 SendMessageToSet(&data, false);
20111}
@ SMSG_THREAT_CLEAR
Definition Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
17123{
17124 if (m_cleanupDone)
17125 {
17126 return;
17127 }
17128
17130 if (Player* playerMe = ToPlayer())
17131 {
17132 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
17133 data << packGUID;
17134 data << uint8(m_comboPoints);
17135 playerMe->SendDirectMessage(&data);
17136 }
17137
17138 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
17139 Player* owner = nullptr;
17140 if (ownerGuid.IsPlayer())
17141 {
17142 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
17143 }
17144
17145 if (m_movedByPlayer || owner)
17146 {
17147 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
17148 data << GetPackGUID();
17149 data << packGUID;
17150 data << uint8(m_comboPoints);
17151
17152 if (m_movedByPlayer)
17154
17155 if (owner && owner != m_movedByPlayer)
17156 owner->SendDirectMessage(&data);
17157 }
17158}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11474{
11475 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11476 data << victim->GetPackGUID();
11477 data << GetPackGUID();
11478 data << uint32(spellID);
11479 data << uint32(powerType);
11480 data << uint32(damage);
11481 SendMessageToSet(&data, true);
11482}
@ SMSG_SPELLENERGIZELOG
Definition Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11441{
11442 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11443
11444 // we guess size
11445 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11446 data << healInfo.GetTarget()->GetPackGUID();
11447 data << GetPackGUID();
11448 data << uint32(healInfo.GetSpellInfo()->Id);
11449 data << uint32(healInfo.GetHeal());
11450 data << uint32(overheal);
11451 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11452 data << uint8(critical ? 1 : 0);
11453 data << uint8(0); // unused
11454 SendMessageToSet(&data, true);
11455}
@ SMSG_SPELLHEALLOG
Definition Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3096{
3097 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3098 data << GetGUID();
3099 data << victim->GetGUID();
3100 if (sendTo)
3101 sendTo->SendDirectMessage(&data);
3102 else
3103 SendMessageToSet(&data, true);
3104 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3105}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3112{
3113 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3114 // pussywizard: this happens in some boss scripts, just add clearing here
3115 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3116
3117 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3118 data << GetPackGUID();
3119
3120 if (victim)
3121 {
3122 data << victim->GetPackGUID();
3123 data << (uint32)victim->isDead();
3124 }
3125 SendMessageToSet(&data, true);
3126 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3127
3128 if (victim)
3129 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3130 else
3131 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3132}
bool isDead() const
Definition Unit.h:1775
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::UpdateAI(), boss_mimiron::UpdateAI(), and boss_razorscale::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_core().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20793{
20794 if (!movespline->Initialized())
20795 return;
20797 data << GetPackGUID();
20798 sendTo->SendDirectMessage(&data);
20799}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16930{
16931 if (IsRooted())
16932 {
16933 // each case where this occurs has to be examined and reported and dealt with.
16934 LOG_ERROR("Unit", "Attempted sending heartbeat with root flag for guid {}", GetGUID().ToString());
16935 return;
16936 }
16937
16938 WorldPacket data;
16939 BuildHeartBeatMsg(&data);
16940 SendMessageToSet(&data, self);
16941}
bool IsRooted() const
Definition Unit.h:1695
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2076

References BuildHeartBeatMsg(), Object::GetGUID(), IsRooted(), LOG_ERROR, WorldObject::SendMessageToSet(), and Position::ToString().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_volkhan::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20802{
20803 if (!movespline->Initialized())
20804 return;
20806 data << GetPackGUID();
20807 sendTo->SendDirectMessage(&data);
20808}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20784{
20785 if (!movespline->Initialized())
20786 return;
20788 data << GetPackGUID();
20789 sendTo->SendDirectMessage(&data);
20790}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

◆ SendMoveRoot()

void Unit::SendMoveRoot ( bool  state)
protected
18490{
18491 const Player* client = GetClientControlling();
18492
18493 // Apply flags in-place when unit currently is not controlled by a player
18494 if (!client)
18495 {
18496 if (apply)
18497 {
18500 if (!client)
18501 StopMoving();
18502 }
18503 else
18505 }
18506
18507 if (!IsInWorld())
18508 return;
18509
18510 const PackedGuid& guid = GetPackGUID();
18511 // Wrath+ spline root: when unit is currently not controlled by a player
18512 if (!client)
18513 {
18514 WorldPacket data(apply ? SMSG_SPLINE_MOVE_ROOT : SMSG_SPLINE_MOVE_UNROOT, guid.size());
18515 data << guid;
18516 SendMessageToSet(&data, true);
18517 }
18518 // Wrath+ force root: when unit is controlled by a player
18519 else
18520 {
18521 uint32 const counter = client->GetSession()->GetOrderCounter();
18522
18523 WorldPacket data(apply ? SMSG_FORCE_MOVE_ROOT : SMSG_FORCE_MOVE_UNROOT, guid.size() + 4);
18524 data << guid;
18525 data << counter;
18526 client->GetSession()->SendPacket(&data);
18527 client->GetSession()->IncrementOrderCounter();
18528 }
18529}
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:410
Player const * GetClientControlling() const
Definition Unit.cpp:21477
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:283
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824
void AddMovementFlag(uint32 flag)
Definition Object.h:343

References MovementInfo::AddMovementFlag(), GetClientControlling(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), WorldSession::IncrementOrderCounter(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_MASK_MOVING_FLY, MOVEMENTFLAG_ROOT, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), PackedGuid::size(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, and StopMoving().

Referenced by Player::BuildPlayerRepop(), Player::KillPlayer(), Player::ResurrectPlayer(), and SetRooted().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6623{
6624 AuraEffect const* aura = pInfo->auraEff;
6626 data << GetPackGUID();
6627 data << aura->GetCasterGUID().WriteAsPacked();
6628 data << uint32(aura->GetId()); // spellId
6629 data << uint32(1); // count
6630 data << uint32(aura->GetAuraType()); // auraId
6631 switch (aura->GetAuraType())
6632 {
6635 {
6636 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6637 uint32 damage = pInfo->damage;
6638 uint32 absorb = pInfo->absorb;
6639 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6640 {
6641 absorb = damage;
6642 damage = 0;
6643 }
6644
6645 data << uint32(damage); // damage
6646 data << uint32(pInfo->overDamage); // overkill?
6647 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6648 data << uint32(absorb); // absorb
6649 data << uint32(pInfo->resist); // resist
6650 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6651 }
6652 break;
6655 data << uint32(pInfo->damage); // damage
6656 data << uint32(pInfo->overDamage); // overheal
6657 data << uint32(pInfo->absorb); // absorb
6658 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6659 break;
6662 data << uint32(aura->GetMiscValue()); // power type
6663 data << uint32(pInfo->damage); // damage
6664 break;
6666 data << uint32(aura->GetMiscValue()); // power type
6667 data << uint32(pInfo->damage); // amount
6668 data << float(pInfo->multiplier); // gain multiplier
6669 break;
6670 default:
6671 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6672 return;
6673 }
6674
6675 SendMessageToSet(&data, true);
6676}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition Opcodes.h:620
float multiplier
Definition Unit.h:528
bool critical
Definition Unit.h:529
uint32 overDamage
Definition Unit.h:525
uint32 resist
Definition Unit.h:527
uint32 damage
Definition Unit.h:524
AuraEffect const * auraEff
Definition Unit.h:523
uint32 absorb
Definition Unit.h:526

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg) const

-------—Pet responses methods--------------—

16835{
16836 Unit* owner = GetOwner();
16837 if (!owner || !owner->IsPlayer())
16838 return;
16839
16841 data << uint8(msg);
16842 owner->ToPlayer()->SendDirectMessage(&data);
16843}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetActionSound()

void Unit::SendPetActionSound ( PetAction  action) const
16846{
16847 SendMessageToSet(WorldPackets::Pet::PetActionSound(GetGUID(), static_cast<int32>(action)).Write(), false);
16848}
Definition PetPackets.h:100

References Object::GetGUID(), and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid) const
16857{
16858 Unit* owner = GetOwner();
16859 if (!owner || !owner->IsPlayer())
16860 return;
16861
16862 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16863 data << guid;
16864 data << uint32(AI_REACTION_HOSTILE);
16865 owner->ToPlayer()->SendDirectMessage(&data);
16866}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetDismissSound()

void Unit::SendPetDismissSound ( ) const
16851{
16852 if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()))
16853 SendMessageToSet(WorldPackets::Pet::PetDismissSound(static_cast<int32>(displayInfo->ModelId), GetPosition()).Write(), false);
16854}
Definition PetPackets.h:112
Position GetPosition() const
Definition Position.h:147

References GetNativeDisplayId(), Position::GetPosition(), sCreatureDisplayInfoStore, and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19178{
19180 data << guid; // target
19181 data << uint32(id); // SpellVisualKit.dbc index
19182 SendMessageToSet(&data, true);
19183}
@ SMSG_PLAY_SPELL_IMPACT
Definition Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20114{
20115 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20116 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20117 data << GetPackGUID();
20118 data << pHostileReference->getUnitGuid().WriteAsPacked();
20119 SendMessageToSet(&data, false);
20120}
@ SMSG_THREAT_REMOVE
Definition Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6703{
6704 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6705 data << GetGUID();
6706 data << target->GetGUID();
6707 data << uint32(spellId);
6708 data << uint8(0); // bool - log format: 0-default, 1-debug
6709 SendMessageToSet(&data, true);
6710}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealDamageShieldDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6693{
6694 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6695 data << GetGUID();
6696 data << target->GetGUID();
6697 data << uint32(spellId);
6698 data << uint8(0); // bool - log format: 0-default, 1-debug
6699 SendMessageToSet(&data, true);
6700}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6679{
6680 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6681 data << uint32(spellID);
6682 data << GetGUID();
6683 data << uint8(0); // can be 0 or 1
6684 data << uint32(1); // target count
6685 // for (i = 0; i < target count; ++i)
6686 data << target->GetGUID(); // target GUID
6687 data << uint8(missInfo);
6688 // end loop
6689 SendMessageToSet(&data, true);
6690}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealDamageShieldDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6545{
6546 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6547 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6548 uint32 damage = log->damage;
6549 uint32 absorb = log->absorb;
6550 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6551 {
6552 absorb = damage;
6553 damage = 0;
6554 }
6555 data << log->target->GetPackGUID();
6556 data << log->attacker->GetPackGUID();
6557 data << uint32(log->spellInfo->Id);
6558 data << uint32(damage); // damage amount
6559 int32 overkill = damage - log->target->GetHealth();
6560 data << uint32(overkill > 0 ? overkill : 0); // overkill
6561 data << uint8 (log->schoolMask); // damage school
6562 data << uint32(absorb); // AbsorbedDamage
6563 data << uint32(log->resist); // resist
6564 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6565 data << uint8 (log->unused); // unused
6566 data << uint32(log->blocked); // blocked
6567 data << uint32(log->HitInfo);
6569 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6570 //{
6571 // data << float(log->CritRoll);
6572 // data << float(log->CritNeeded);
6573 //}
6574 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6575 //{
6576 // data << float(log->HitRoll);
6577 // data << float(log->HitNeeded);
6578 //}
6579 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6580 //{
6581 // data << float(log->MissChance);
6582 // data << float(log->DodgeChance);
6583 // data << float(log->ParryChance);
6584 // data << float(log->BlockChance);
6585 // data << float(log->GlanceChance);
6586 // data << float(log->CrushChance);
6587 //}
6588 SendMessageToSet(&data, true);
6589}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition SharedDefines.h:1548
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition SharedDefines.h:1551
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition SharedDefines.h:1546
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition Opcodes.h:622
bool physicalLog
Definition Unit.h:510
bool unused
Definition Unit.h:511

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6592{
6593 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6594 log.damage = Damage;
6595 log.absorb = AbsorbedDamage;
6596 log.resist = Resist;
6597 log.physicalLog = PhysicalDamage;
6598 log.blocked = Blocked;
6599 log.HitInfo = 0;
6600 if (CriticalHit)
6601 {
6602 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6603 }
6604 if (Split)
6605 {
6606 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6607 }
6609}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1549
Definition Unit.h:496

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6513{
6514 // Xinef: function for players only, placed in unit because of cosmetics
6515 if (!IsPlayer())
6516 return;
6517
6518 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6519 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6520 uint32 damage = log->damage;
6521 uint32 absorb = log->absorb;
6522 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6523 {
6524 absorb = damage;
6525 damage = 0;
6526 }
6527 data << log->target->GetPackGUID();
6528 data << attacker->GetPackGUID();
6529 data << uint32(log->spellInfo->Id);
6530 data << uint32(damage); // damage amount
6531 int32 overkill = damage - log->target->GetHealth();
6532 data << uint32(overkill > 0 ? overkill : 0); // overkill
6533 data << uint8 (log->schoolMask); // damage school
6534 data << uint32(absorb); // AbsorbedDamage
6535 data << uint32(log->resist); // resist
6536 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6537 data << uint8 (log->unused); // unused
6538 data << uint32(log->blocked); // blocked
6539 data << uint32(log->HitInfo);
6540 data << uint8 (0); // flag to use extend data
6541 ToPlayer()->SendDirectMessage(&data);
6542}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19986{
19988 data << uint8(result);
19989 ToPlayer()->SendDirectMessage(&data);
19990}
@ SMSG_PET_TAME_FAILURE
Definition Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19993{
19995 if (IsCreature())
19996 Relocate(&pos);
19997 if (IsPlayer())
19998 {
19999 ToPlayer()->SetCanTeleport(true);
20000 }
20001 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
20002 data2 << GetPackGUID();
20003 BuildMovementPacket(&data2);
20004 if (IsCreature())
20005 Relocate(&oldPos);
20006 if (IsPlayer())
20007 Relocate(&pos);
20008 SendMessageToSet(&data2, false);
20009}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20065{
20066 if (!GetThreatMgr().isThreatListEmpty())
20067 {
20068 uint32 count = GetThreatMgr().GetThreatList().size();
20069
20070 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20071 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20072 data << GetPackGUID();
20073 data << uint32(count);
20075 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20076 {
20077 data << (*itr)->getUnitGuid().WriteAsPacked();
20078 data << uint32((*itr)->GetThreat() * 100);
20079 }
20080 SendMessageToSet(&data, false);
20081 }
20082}
@ SMSG_THREAT_UPDATE
Definition Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
684{ i_AI = newAI; }

References i_AI.

◆ SetAnimTier()

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
19161{
19162 Aura* aura = target->GetAura(spellId, GetGUID());
19163 if (!aura)
19164 aura = AddAura(spellId, target);
19165 if (aura && stack)
19166 aura->SetStackAmount(stack);
19167}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:937

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1196{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

void Unit::SetCanFly ( bool  enable)

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

20619{
20620 bool isClientControlled = IsClientControlled();
20621
20622 if (!isClientControlled)
20623 {
20624 if (enable)
20626 else
20628 }
20629
20630 if (!IsInWorld()) // is sent on add to map
20631 return;
20632
20633 if (isClientControlled)
20634 {
20635 if (Player const* player = GetClientControlling())
20636 {
20637 uint32 const counter = player->GetSession()->GetOrderCounter();
20638 const_cast<Player*>(player)->SetPendingFlightChange(counter);
20639
20641 data << GetPackGUID();
20642 data << counter;
20643 player->SendDirectMessage(&data);
20644 player->GetSession()->IncrementOrderCounter();
20645 return;
20646 }
20647 }
20648
20650 data << GetPackGUID();
20651 SendMessageToSet(&data, true);
20652}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
@ SMSG_SPLINE_MOVE_SET_FLYING
Definition Opcodes.h:1088
@ SMSG_MOVE_SET_CAN_FLY
Definition Opcodes.h:865
@ SMSG_SPLINE_MOVE_UNSET_FLYING
Definition Opcodes.h:1089
@ SMSG_MOVE_UNSET_CAN_FLY
Definition Opcodes.h:866

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_CAN_FLY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, SMSG_SPLINE_MOVE_SET_FLYING, and SMSG_SPLINE_MOVE_UNSET_FLYING.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_kalecgos_kj::DoAction(), boss_nightbane::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), gm_commandscript::HandleGMFlyCommand(), WorldSession::HandleMoveKnockBackAck(), boss_felmyst::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_urom::boss_uromAI::JustDied(), boss_ayamiss::JustEngagedWith(), npc_icc_spire_frostwyrm::JustReachedHome(), brann_bronzebeard::brann_bronzebeardAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), boss_onyxia::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), npc_alexstrasza::npc_alexstrasza(), npc_batrider::npc_batrider(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_pet_gen_moth::npc_pet_gen_moth(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_hallows_end_soh::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), npc_ulduar_mimiron_rocket::Reset(), boss_nazan::Reset(), boss_felmyst::ScheduleGroundAbilities(), SmartAI::SetFly(), npc_simon_bunny::npc_simon_bunnyAI::SetGUID(), boss_urom::boss_uromAI::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_batrider::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17540{
17541 if (apply)
17542 ++m_procDeep;
17543 else
17544 {
17546 --m_procDeep;
17547 }
17548}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
11087{
11088 if (apply)
11089 {
11090 if (IsPlayer())
11091 {
11092 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11093 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11094
11095 charm->m_ControlledByPlayer = true;
11097 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11098 }
11099 else
11100 {
11101 charm->m_ControlledByPlayer = false;
11103 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11104 }
11105
11106 // PvP, FFAPvP
11107 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
11108
11109 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11110 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11111
11112 _isWalkingBeforeCharm = charm->IsWalking();
11114 {
11115 charm->SetWalk(false);
11116 charm->SendMovementFlagUpdate();
11117 }
11118
11119 m_Controlled.insert(charm);
11120 }
11121 else
11122 {
11123 charm->ClearUnitState(UNIT_STATE_CHARMED);
11124
11125 if (IsPlayer())
11126 {
11127 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11128 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11129 }
11130
11131 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11132 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11133
11134 if (charm->IsPlayer())
11135 {
11136 charm->m_ControlledByPlayer = true;
11137 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11138 charm->ToPlayer()->UpdatePvPState();
11139 }
11140 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11141 {
11142 charm->m_ControlledByPlayer = true;
11143 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11144 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11145
11146 // Xinef: skip controlled erase if charmed unit is owned by charmer
11147 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11148 return;
11149 }
11150 else
11151 {
11152 charm->m_ControlledByPlayer = false;
11153 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11154 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11155 }
11156
11157 if (charm->IsWalking() != _isWalkingBeforeCharm)
11158 {
11159 charm->SetWalk(_isWalkingBeforeCharm);
11160 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11161 }
11162
11163 m_Controlled.erase(charm);
11164 }
11165}
@ UNIT_STATE_CHARMED
Definition UnitDefines.h:172
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:693

References _isWalkingBeforeCharm, Object::AddGuidValue(), ClearUnitState(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetName(), HasUnitFlag(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, UNIT_STATE_CHARMED, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18607{
18608 if (!charmer)
18609 return false;
18610
18611 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18612 {
18613 return false;
18614 }
18615
18616 // dismount players when charmed
18617 if (IsPlayer() && type != CHARM_TYPE_POSSESS)
18619
18620 if (charmer->IsPlayer())
18622
18623 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18624 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18625 throw 1;
18626 ASSERT((type == CHARM_TYPE_VEHICLE) == (GetVehicleKit() && GetVehicleKit()->IsControllableVehicle()));
18627
18628 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18629 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18630
18631 if (this == charmer)
18632 {
18633 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18634 return false;
18635 }
18636
18637 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18638 // return false;
18639
18640 if (IsPlayer() && ToPlayer()->GetTransport())
18641 {
18642 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18643 return false;
18644 }
18645
18646 // Already charmed
18647 if (GetCharmerGUID())
18648 {
18649 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18650 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18651 return false;
18652 }
18653
18654 CastStop();
18655 AttackStop();
18656
18657 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18658 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18659 // DeleteThreatList();
18660
18661 Player* playerCharmer = charmer->ToPlayer();
18662
18663 // Charmer stop charming
18664 if (playerCharmer)
18665 {
18666 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18667 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18668 }
18669
18670 // Charmed stop charming
18671 if (IsPlayer())
18672 {
18673 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18674 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18675 }
18676
18677 // StopCastingCharm may remove a possessed pet?
18678 if (!IsInWorld())
18679 {
18680 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18681 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18682 return false;
18683 }
18684
18685 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18686 // prevent undefined behaviour
18687 if (aurApp && aurApp->GetRemoveMode())
18688 return false;
18689
18691 SetFaction(charmer->GetFaction());
18692
18693 // Set charmed
18694 charmer->SetCharm(this, true);
18695
18697
18698 if (IsCreature())
18699 {
18700 GetMotionMaster()->Clear(false);
18702 StopMoving();
18703
18704 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18705 {
18706 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18707 Creature* charmed = ToCreature();
18708 charmed->NeedChangeAI = true;
18709 charmed->IsAIEnabled = false;
18710 }
18711 else
18712 {
18713 ToCreature()->AI()->OnCharmed(true);
18714 }
18715
18716 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18717 if (charmer->IsPlayer() && ToCreature()->CanFly())
18719 }
18720 else
18721 {
18722 Player* player = ToPlayer();
18723 if (player->isAFK())
18724 player->ToggleAFK();
18725
18726 player->SetClientControl(this, false); // verified
18727 }
18728
18729 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18730 // prevent undefined behaviour
18731 if (aurApp && aurApp->GetRemoveMode())
18732 return false;
18733
18734 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18735 // Xinef: I need charmInfo for vehicle
18736 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18737 {
18738 InitCharmInfo();
18739 if (type == CHARM_TYPE_POSSESS)
18741 else if (type != CHARM_TYPE_VEHICLE)
18742 {
18744
18745 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18746 if (type == CHARM_TYPE_CONVERT && IsCreature())
18748 }
18749 }
18750
18751 if (playerCharmer)
18752 {
18753 switch (type)
18754 {
18755 case CHARM_TYPE_VEHICLE:
18758 playerCharmer->SetClientControl(this, true); // verified
18759 playerCharmer->VehicleSpellInitialize();
18760 break;
18761 case CHARM_TYPE_POSSESS:
18766 playerCharmer->SetClientControl(this, true); // verified
18767 playerCharmer->PossessSpellInitialize();
18768 break;
18769 case CHARM_TYPE_CHARM:
18771 {
18773 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18774 {
18775 // to prevent client crash
18777
18778 // just to enable stat window
18779 if (GetCharmInfo())
18780 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18781
18782 // if charmed two demons the same session, the 2nd gets the 1st one's name
18783 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18784 }
18785 }
18786 if (playerCharmer->m_seer != this)
18787 {
18789 playerCharmer->CharmSpellInitialize();
18790 }
18791 break;
18792 default:
18793 break;
18794 }
18795 }
18796 else if (IsPlayer())
18798
18800
18801 if (Creature* creature = ToCreature())
18802 creature->RefreshSwimmingFlag();
18803
18804 if (IsPlayer())
18805 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18806
18807 return true;
18808}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:556
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:36
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:99
void MoveIdle()
Definition MotionMaster.cpp:233
void CharmSpellInitialize()
Definition Player.cpp:9674
WorldObject * m_seer
Definition Player.h:2367
void ToggleAFK()
Definition Player.cpp:1311
void PossessSpellInitialize()
Definition Player.cpp:9571
bool isAFK() const
Definition Player.h:1150
void VehicleSpellInitialize()
Definition Player.cpp:9599
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13177
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:762
virtual float GetFollowAngle() const
Definition Unit.h:1875
CharmInfo * InitCharmInfo()
Definition Unit.cpp:16041
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), GetVehicleKit(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_CHARMED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
935{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18575{
18576 if (apply)
18577 {
18578 SetTarget();
18580 }
18581 else
18582 {
18583 if (IsAlive())
18584 {
18585 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18586 {
18588 StopMoving();
18589 }
18590
18591 if (GetVictim())
18593 }
18594 }
18595
18596 // xinef: block / allow control to real mover (eg. charmer)
18597 if (IsPlayer())
18598 {
18599 if (m_movedByPlayer)
18600 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18601 //else
18602 // ToPlayer()->SetClientControl(this, !apply);
18603 }
18604}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:293

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17502{
17504
17505 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17506 return;
17507
17508 // check if there any guards that should care about the contested flag on player
17509 if (lookForNearContestedGuards)
17510 {
17511 std::list<Unit*> targets;
17514 Cell::VisitObjects(this, searcher, MAX_AGGRO_RADIUS);
17515
17516 // return if there are no contested guards found
17517 if (!targets.size())
17518 {
17519 return;
17520 }
17521 }
17522
17523 player->SetContestedPvPTimer(30000);
17525 {
17528 // call MoveInLineOfSight for nearby contested guards
17530 }
17532 {
17534 // call MoveInLineOfSight for nearby contested guards
17536 }
17537}
#define MAX_AGGRO_RADIUS
Definition Unit.h:45
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1125
bool InBattleground() const
Definition Player.h:2285
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1883

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18302{
18303 if (apply)
18304 {
18305 if (HasUnitState(state))
18306 return;
18307
18308 AddUnitState(state);
18309 switch (state)
18310 {
18311 case UNIT_STATE_STUNNED:
18312 SetStunned(true);
18313 break;
18314 case UNIT_STATE_ROOT:
18316 SetRooted(true);
18317 break;
18320 {
18323 // SendAutoRepeatCancel ?
18324 SetConfused(true);
18325 CastStop(0, false);
18326 }
18327 break;
18328 case UNIT_STATE_FLEEING:
18330 {
18333 // SendAutoRepeatCancel ?
18334 SetFeared(true, source, isFear);
18335 CastStop(0, false);
18336 }
18337 break;
18338 default:
18339 break;
18340 }
18341
18342 if (IsPlayer())
18343 {
18344 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18345 }
18346 }
18347 else
18348 {
18349 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18350 // xinef: added to each case because of return
18351 //ClearUnitState(state);
18352
18353 switch (state)
18354 {
18355 case UNIT_STATE_STUNNED:
18356 if (HasStunAura())
18357 return;
18358 ClearUnitState(state);
18359 SetStunned(false);
18360 break;
18361 case UNIT_STATE_ROOT:
18362 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18363 if (IsCreature())
18364 {
18365 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18366 {
18367 return;
18368 }
18369 }
18370
18371 if (HasRootAura() || GetVehicle())
18372 return;
18373 ClearUnitState(state);
18374 SetRooted(false);
18375 break;
18377 if (HasConfuseAura())
18378 return;
18379 ClearUnitState(state);
18380 SetConfused(false);
18381 break;
18382 case UNIT_STATE_FLEEING:
18383 if (HasFearAura())
18384 return;
18385 ClearUnitState(state);
18386 SetFeared(false);
18387 break;
18388 default:
18389 return;
18390 }
18391
18392 //ClearUnitState(state);
18393
18395 SetStunned(true);
18396 else
18397 {
18399 SetRooted(true);
18400
18402 SetConfused(true);
18404 {
18405 bool isFear = false;
18406 if (HasFearAura())
18407 {
18408 isFear = true;
18409 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18410 }
18411
18412 if (!source)
18413 {
18414 source = getAttackerForHelper();
18415 }
18416
18417 SetFeared(true, source, isFear);
18418 }
18419 }
18420 }
18421}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18542
bool HasStunAura() const
Definition Unit.h:1819
void SetConfused(bool apply)
Definition Unit.cpp:18574
void SetStunned(bool apply)
Definition Unit.cpp:18423
Unit * getAttackerForHelper() const
Definition Unit.cpp:754
bool HasConfuseAura() const
Definition Unit.h:1817
void SetRooted(bool apply, bool stun=false, bool logout=false)
Definition Unit.cpp:18469
bool HasRootAura() const
Definition Unit.h:1818
bool HasFearAura() const
Definition Unit.h:1816
Definition Unit.h:264

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::EnterEvadeMode(), boss_razorscale::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::MovementInform(), boss_razorscale::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_hodirs_fury::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayal(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::Reset(), boss_thorim_pillar::Reset(), boss_xt002::Reset(), boss_yoggsaron_immortal_guardian::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::UpdateAI(), npc_hodirs_fury::UpdateAI(), boss_ignis::UpdateAI(), boss_razorscale::UpdateAI(), boss_xt002::UpdateAI(), boss_yoggsaron_immortal_guardian::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4002{
4003 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4004
4005 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4006
4007 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4008 return;
4009
4010 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4011
4012 // break same type spell if it is not delayed
4013 InterruptSpell(CSpellType, false, true, bySelf);
4014
4015 // special breakage effects:
4016 switch (CSpellType)
4017 {
4019 {
4020 // generic spells always break channeled not delayed spells
4022 {
4023 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4024 {
4026 }
4027 }
4028
4029 // autorepeat breaking
4031 {
4032 // break autorepeat if not Auto Shot
4033 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4035 m_AutoRepeatFirstCast = true;
4036 }
4037
4038 // melee spells breaking
4040 {
4041 // break melee spells if cast time
4042 if (pSpell->GetCastTime() > 0)
4043 {
4045 }
4046 }
4047 if (pSpell->GetCastTime() > 0)
4049
4050 break;
4051 }
4053 {
4054 // channel spells always break generic non-delayed and any channeled spells
4056 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4057
4058 // it also does break autorepeat if not Auto Shot
4060 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4063
4064 break;
4065 }
4067 {
4068 // only Auto Shoot does not break anything
4069 if (pSpell->m_spellInfo->Id != 75)
4070 {
4071 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4073 {
4074 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4075 {
4077 }
4078 }
4079
4081 }
4082 // special action: set first cast flag
4083 m_AutoRepeatFirstCast = true;
4084
4085 break;
4086 }
4087
4088 default:
4089 // other spell types don't break anything now
4090 break;
4091 }
4092
4093 // current spell (if it is still here) may be safely deleted now
4094 if (m_currentSpells[CSpellType])
4095 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4096
4097 // set new current spell
4098 m_currentSpells[CSpellType] = pSpell;
4099 pSpell->SetReferencedFromCurrent(true);
4100
4101 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4102}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7904
Spell ** m_selfContainer
Definition Spell.h:622

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14668{
14669 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14670 // it can be used to check creation of death items (such as soul shards).
14671 m_deathState = s;
14672
14674 {
14675 CombatStop();
14678 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14679
14680 if (IsNonMeleeSpellCast(false))
14682
14683 UnsummonAllTotems(true);
14684 RemoveAllControlled(true);
14686 }
14687
14688 if (s == DeathState::JustDied)
14689 {
14690 // remove aurastates allowing special moves
14693
14694 GetMotionMaster()->Clear(false);
14696
14697 // Xinef: Remove Hover so the corpse can fall to the ground
14698 SetHover(false);
14699
14700 if (despawn)
14701 DisableSpline();
14702 else
14703 StopMoving();
14704
14705 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14706 // do not why since in IncreaseMaxHealth currenthealth is checked
14707 SetHealth(0);
14708 SetPower(getPowerType(), 0);
14709
14710 // Stop emote on death
14712
14713 // players in instance don't have ZoneScript, but they have InstanceScript
14715 zoneScript->OnUnitDeath(this);
14716 }
14717 else if (s == DeathState::JustRespawned)
14718 {
14719 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14720 }
14721}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:280
void SetHover(bool enable)
Definition Unit.cpp:20695
void ClearAllReactives()
Definition Unit.cpp:17168
void ClearDiminishings()
Definition Unit.h:1842
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1214
ZoneScript * GetZoneScript() const
Definition Object.h:626
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

void Unit::SetDisableGravity ( bool  disable)
20559{
20560 bool isClientControlled = IsClientControlled();
20561
20562 if (!isClientControlled)
20563 {
20564 if (enable)
20566 else
20568 }
20569
20570 if (!IsInWorld()) // is sent on add to map
20571 return;
20572
20573 if (isClientControlled)
20574 {
20575 if (Player const* player = GetClientControlling())
20576 {
20577 uint32 const counter = player->GetSession()->GetOrderCounter();
20578
20580 data << GetPackGUID();
20581 data << counter;
20582 player->GetSession()->SendPacket(&data);
20583 player->GetSession()->IncrementOrderCounter();
20584 return;
20585 }
20586 }
20587
20589 data << GetPackGUID();
20590 SendMessageToSet(&data, true);
20591}
@ SMSG_SPLINE_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1265
@ SMSG_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1262
@ SMSG_SPLINE_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1266

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_DISABLE_GRAVITY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_ENABLE, SMSG_SPLINE_MOVE_GRAVITY_DISABLE, and SMSG_SPLINE_MOVE_GRAVITY_ENABLE.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_yoggsaron_brain::boss_yoggsaron_brain(), boss_the_lurker_below::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_nightbane::DoAction(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_algalon_the_observer::DoAction(), npc_madrigosa::DoAction(), boss_kalecgos::DoAction(), npc_kalecgos_kj::DoAction(), boss_illidan_stormrage::DoAction(), boss_nightbane::EnterEvadeMode(), boss_malygos::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_razorscale::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), boss_sartharion_dragonAI::HandleExtraEvent(), spell_the_lich_king_valkyr_target_search::HandleScript(), boss_felmyst::InitializeAI(), boss_taldaram::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), boss_malygos::InitializeAI(), boss_razorscale::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_kologarn::JustDied(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), npc_spinestalker::npc_spinestalkerAI::JustReachedHome(), npc_rimefang::npc_rimefangAI::JustReachedHome(), npc_icc_spire_frostwyrm::JustReachedHome(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_algalon_the_observer::MovementInform(), npc_enslaved_netherwing_drake::MovementInform(), boss_onyxia::MovementInform(), boss_ayamiss::MovementInform(), boss_taldaram::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), boss_malygos::MovementInform(), npc_oculus_drake::npc_oculus_drakeAI::MovementInform(), boss_razorscale::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), boss_headless_horseman::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_kaelthas::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), boss_sartharion_dragonAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_alexstrasza::npc_alexstrasza(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_gothik_trigger::npc_gothik_triggerAI::npc_gothik_triggerAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::npc_icc_nerubar_broodkeeperAI(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), npc_nightbane_helper_target::npc_nightbane_helper_target(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unit(), spell_chapter5_light_of_dawn_aura::OnApply(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_jeklik::PathEndReached(), boss_nefarian::PathEndReached(), SmartScript::ProcessAction(), boss_nefarian::Reset(), boss_kalecgos::Reset(), npc_akilzon_eagle::Reset(), boss_jeklik::Reset(), npc_soh_fire_trigger::Reset(), npc_hallows_end_soh::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_jedoga_shadowseeker::Reset(), boss_sartharion_dragonAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), npc_spinestalker::npc_spinestalkerAI::Reset(), npc_rimefang::npc_rimefangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), boss_stormcaller_brundir::Reset(), boss_kologarn::Reset(), boss_thorim_pillar::Reset(), boss_yoggsaron_sara::Reset(), boss_illidan_stormrage::Reset(), boss_nazan::Reset(), boss_kaelthas::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), Creature::setDeathState(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_onyxia::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_mimiron::UpdateAI(), boss_razorscale::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetDisplayId()

◆ SetDualWieldMode()

virtual void Unit::SetDualWieldMode ( DualWieldMode  mode)
inlinevirtual
965{ _dualWieldMode = mode; }

References _dualWieldMode.

Referenced by Creature::InitEntry(), and Creature::UpdateEntry().

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20508{
20509 Movement::MoveSplineInit init(this);
20510 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20512 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20513 init.SetFacing(ori);
20514 init.Launch();
20515}
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:764
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:19014

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::MovementInform(), npc_brann_bronzebeard_algalon::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_hadronox_crusherPackAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object,
Milliseconds  timed = 0ms 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20518{
20519 // never face when already moving
20520 if (!IsStopped())
20521 return;
20522
20524 Movement::MoveSplineInit init(this);
20525 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20526 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20527 init.Launch();
20528
20529 if (timed > 0ms)
20530 {
20531 if (Creature* c = ToCreature())
20532 {
20533 c->m_Events.AddEventAtOffset([c]()
20534 {
20535 if (c->IsInWorld() && c->FindMap() && c->IsAlive() && !c->IsInCombat())
20536 c->SetFacingTo(c->GetHomePosition().GetOrientation());
20537 }, timed);
20538 }
20539 else
20540 LOG_ERROR("entities.unit", "Unit::SetFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20541 }
20542}
bool IsStopped() const
Definition Unit.h:1742

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), Spell::EffectSummonType(), spell_chapter5_return_to_capital::HandleHit(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), npc_overlord_drakuru_betrayal::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::UpdateAI(), npc_ulduar_vx001::UpdateAI(), npc_ulduar_expedition_engineer::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10242{
10244 if (IsCreature())
10246}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2546

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_thorim::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), boss_algalon_the_observer::DoAction(), boss_kalecgos::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_oculus::instance_oculus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::PassengerBoarded(), npc_frosthound::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), boss_algalon_the_observer::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_mimiron::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18543{
18544 if (apply)
18545 {
18546 SetTarget();
18547 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18548 }
18549 else
18550 {
18551 if (IsAlive())
18552 {
18553 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18554 {
18556 StopMoving();
18557 }
18558
18559 if (GetVictim())
18561 }
18562 }
18563
18564 // xinef: block / allow control to real mover (eg. charmer)
18565 if (IsPlayer())
18566 {
18567 if (m_movedByPlayer)
18568 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18569 //else
18570 // ToPlayer()->SetClientControl(this, !apply);
18571 }
18572}
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition WorldConfig.h:238
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:795

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

void Unit::SetFeatherFall ( bool  enable)
20655{
20656 bool isClientControlled = IsClientControlled();
20657
20658 if (!isClientControlled)
20659 {
20660 if (enable)
20662 else
20664 }
20665
20666 if (!IsInWorld()) // is sent on add to map
20667 return;
20668
20669 if (isClientControlled)
20670 {
20671 if (Player const* player = GetClientControlling())
20672 {
20673 uint32 const counter = player->GetSession()->GetOrderCounter();
20674
20676
20677 data << GetPackGUID();
20678 data << counter;
20679 player->SendDirectMessage(&data);
20680 player->GetSession()->IncrementOrderCounter();
20681
20682 // start fall from current height
20683 if (!enable)
20684 const_cast<Player*>(player)->SetFallInformation(0, GetPositionZ());
20685
20686 return;
20687 }
20688 }
20689
20691 data << GetPackGUID();
20692 SendMessageToSet(&data, true);
20693}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:398
@ SMSG_MOVE_FEATHER_FALL
Definition Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition Opcodes.h:273
@ SMSG_SPLINE_MOVE_NORMAL_FALL
Definition Opcodes.h:804

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), Position::GetPositionZ(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING_SLOW, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_FEATHER_FALL, SMSG_MOVE_NORMAL_FALL, SMSG_SPLINE_MOVE_FEATHER_FALL, and SMSG_SPLINE_MOVE_NORMAL_FALL.

Referenced by AuraEffect::HandleAuraFeatherFall(), and debug_commandscript::HandleDebugMoveflagsCommand().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15723{
15725 val = 0;
15726 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15727 val = 1;
15728 else
15729 {
15730 uint32 maxHealth = GetMaxHealth();
15731 if (maxHealth < val)
15732 val = maxHealth;
15733 }
15734
15735 float prevHealthPct = GetHealthPct();
15736
15738
15739 // mobs that are now or were below 30% need to update their speed
15740 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15741 {
15742 UpdateSpeed(MOVE_RUN, false);
15743 }
15744
15745 // group update
15746 if (IsPlayer())
15747 {
15748 Player* player = ToPlayer();
15749 if (player->NeedSendSpectatorData())
15751
15752 if (player->GetGroup())
15754 }
15755 else if (Pet* pet = ToCreature()->ToPet())
15756 {
15757 if (pet->isControlled())
15758 {
15759 if (Unit* owner = GetOwner())
15760 if (Player* player = owner->ToPlayer())
15761 {
15762 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15763 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15764
15765 if (player->GetGroup())
15767 }
15768 }
15769 }
15770}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15504
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2507
float GetHealthPct() const
Definition Unit.h:1095
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by Battleground::AddPlayer(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::DamageTaken(), boss_thorim::DamageTaken(), boss_yoggsaron_sara::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::DoAction(), npc_xt002_heart::DoAction(), boss_yoggsaron::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_spark(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_flame_leviathan_defense_turret::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

void Unit::SetHover ( bool  enable)
20696{
20697 bool isClientControlled = IsClientControlled();
20698
20699 if (!isClientControlled)
20700 {
20701 if (enable)
20703 else
20705 }
20706
20707 float hoverHeight = GetHoverHeight();
20708
20709 if (enable)
20710 {
20711 if (hoverHeight && GetPositionZ() - GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()) < hoverHeight)
20712 Relocate(GetPositionX(), GetPositionY(), GetPositionZ() + hoverHeight);
20713 }
20714 else
20715 {
20716 if (IsAlive() || !IsUnit())
20717 {
20718 float newZ = std::max<float>(GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()), GetPositionZ() - hoverHeight);
20721 }
20722 }
20723
20724 if (!IsInWorld()) // is sent on add to map
20725 return;
20726
20727 if (isClientControlled)
20728 {
20729 if (Player const* player = GetClientControlling())
20730 {
20732
20733 uint32 const counter = player->GetSession()->GetOrderCounter();
20734
20735 data << GetPackGUID();
20736 data << counter;
20737 player->SendDirectMessage(&data);
20738 player->GetSession()->IncrementOrderCounter();
20739 return;
20740 }
20741 }
20742
20744 data << GetPackGUID();
20745 SendMessageToSet(&data, true);
20746}
bool IsUnit() const
Definition Object.h:208
float GetHoverHeight() const
Definition Unit.h:1697
uint32 GetPhaseMask() const
Definition Object.h:512
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1580
@ SMSG_MOVE_SET_HOVER
Definition Opcodes.h:274
@ SMSG_SPLINE_MOVE_UNSET_HOVER
Definition Opcodes.h:806
@ SMSG_MOVE_UNSET_HOVER
Definition Opcodes.h:275

References MovementInfo::AddMovementFlag(), GetClientControlling(), GetHoverHeight(), WorldObject::GetMap(), Object::GetPackGUID(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsAlive(), IsClientControlled(), Object::IsInWorld(), Object::IsUnit(), WorldObject::m_movementInfo, MOVEMENTFLAG_HOVER, Position::Relocate(), MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_HOVER, SMSG_MOVE_UNSET_HOVER, SMSG_SPLINE_MOVE_SET_HOVER, SMSG_SPLINE_MOVE_UNSET_HOVER, and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_illidan_stormrage::DoAction(), AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_sartharion_dragonAI::HandleExtraEvent(), boss_taldaram::InitializeAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), boss_taldaram::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sartharion_dragonAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), boss_jedoga_shadowseeker::Reset(), boss_sartharion_dragonAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_illidan_stormrage::Reset(), setDeathState(), Creature::setDeathState(), boss_jedoga_shadowseeker::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
914{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13777

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_living_constellation::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13769{
13770 (void)keepCombat;
13771 if (apply)
13773 else
13775}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::DoAction(), npc_frozen_core::DoAction(), boss_tenris_mirkblood::EnterEvadeMode(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_tenris_mirkblood::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_wild_wyrm::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_overlord_drakuru_betrayal::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_wild_wyrm::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), and npc_magister_aledis::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13900{
13901 // only alive units can be in combat
13902 if (!IsAlive())
13903 return;
13904
13905 if (PvP)
13906 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13907 else if (duration)
13908 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13909
13911 return;
13912
13913 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13914 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13915 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13916
13917 if (IsInCombat())
13918 return;
13919
13921
13922 if (Creature* creature = ToCreature())
13923 {
13924 // Set home position at place of engaging combat for escorted creatures
13925 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13926 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13927 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13928 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13929
13930 if (enemy)
13931 {
13932 creature->UpdateLeashExtensionTime();
13933
13934 if (IsAIEnabled)
13935 creature->AI()->JustEngagedWith(enemy);
13936
13937 if (creature->GetFormation())
13938 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13939
13940 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13941 }
13942
13943 creature->RefreshSwimmingFlag();
13944
13945 if (IsPet())
13946 {
13947 UpdateSpeed(MOVE_RUN, true);
13948 UpdateSpeed(MOVE_SWIM, true);
13949 UpdateSpeed(MOVE_FLIGHT, true);
13950 }
13951
13952 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13953 Dismount();
13954 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13956 }
13957
13958 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13959 {
13960 Unit* controlled = *itr;
13961 ++itr;
13962
13963 // Xinef: Dont set combat for passive units, they will evade in next update...
13964 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13965 continue;
13966
13967 controlled->SetInCombatState(PvP, enemy, duration);
13968 }
13969
13970 if (Player* player = this->ToPlayer())
13971 {
13972 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13973 }
13974}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2640
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2707
@ MOVE_FLIGHT
Definition UnitDefines.h:359
@ MOVE_SWIM
Definition UnitDefines.h:356
bool HasReactState(ReactStates state) const
Definition Creature.h:101
uint32 GetCombatTimer() const
Definition Unit.h:934
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13899
bool IsStandState() const
Definition Unit.cpp:16952

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13742{
13743 // Xinef: Dont allow to start combat with triggers
13744 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13745 return;
13746
13747 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13748 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13749 {
13750 SetInCombatState(true, enemy, duration);
13751 return;
13752 }
13753
13754 // check for duel
13755 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13756 {
13757 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13758 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13759 {
13760 SetInCombatState(true, enemy, duration);
13761 return;
13762 }
13763 }
13764
13765 SetInCombatState(false, enemy, duration);
13766}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1571{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
994{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1136{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

void Unit::SetLevel ( uint8  lvl,
bool  showLevelChange = true 
)

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15773{
15774 if (!val)
15775 val = 1;
15776
15777 uint32 health = GetHealth();
15779
15780 // group update
15781 if (IsPlayer())
15782 {
15783 Player* player = ToPlayer();
15784 if (player->NeedSendSpectatorData())
15786
15787 if (player->GetGroup())
15789 }
15790 else if (Pet* pet = ToCreature()->ToPet())
15791 {
15792 if (pet->isControlled())
15793 {
15794 if (Unit* owner = GetOwner())
15795 if (Player* player = owner->ToPlayer())
15796 {
15797 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15798 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15799
15800 if (player->GetGroup())
15802 }
15803 }
15804 }
15805
15806 if (val < health)
15807 SetHealth(val);
15808}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_spark(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15862{
15863 uint32 cur_power = GetPower(power);
15864 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15865
15866 // group update
15867 if (IsPlayer())
15868 {
15869 Player* player = ToPlayer();
15870 if (getPowerType() == power && player->NeedSendSpectatorData())
15871 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15872
15873 if (player->GetGroup())
15875 }
15876 else if (Pet* pet = ToCreature()->ToPet())
15877 {
15878 if (pet->isControlled())
15879 {
15880 Unit* owner = GetOwner();
15881 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15883 }
15884 }
15885
15886 if (val < cur_power)
15887 SetPower(power, val);
15888}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:787

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10896{
10897 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10898
10899 if (apply)
10900 {
10901 if (minion->GetOwnerGUID())
10902 {
10903 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10904 return;
10905 }
10906
10907 minion->SetOwnerGUID(GetGUID());
10908
10909 m_Controlled.insert(minion);
10910
10911 if (IsPlayer())
10912 {
10913 minion->m_ControlledByPlayer = true;
10915 }
10916
10917 // Can only have one pet. If a new one is summoned, dismiss the old one.
10918 if (minion->IsGuardianPet())
10919 {
10920 if (Guardian* oldPet = GetGuardianPet())
10921 {
10922 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10923 {
10924 // remove existing minion pet
10925 if (Pet* oldPetAsPet = oldPet->ToPet())
10926 {
10927 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10928 }
10929 else
10930 {
10931 oldPet->UnSummon();
10932 }
10933
10934 SetPetGUID(minion->GetGUID());
10936 }
10937 }
10938 else
10939 {
10940 SetPetGUID(minion->GetGUID());
10942 }
10943 }
10944
10946 {
10948 }
10949
10950 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10951 {
10952 SetCritterGUID(minion->GetGUID());
10953 }
10954
10955 // PvP, FFAPvP
10957
10958 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10959 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10960 minion->setPowerType(POWER_ENERGY);
10961
10962 if (IsPlayer())
10963 {
10964 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10965 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10966
10967 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10968 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10969 }
10970 }
10971 else
10972 {
10973 if (minion->GetOwnerGUID() != GetGUID())
10974 {
10975 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10976 return;
10977 }
10978
10979 m_Controlled.erase(minion);
10980
10981 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10982 {
10983 if (GetCritterGUID() == minion->GetGUID())
10985 }
10986
10987 if (minion->IsGuardianPet())
10988 {
10989 if (GetPetGUID() == minion->GetGUID())
10991 }
10992 else if (minion->IsTotem())
10993 {
10994 // All summoned by totem minions must disappear when it is removed.
10995 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10996 {
10997 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10998 {
10999 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
11000 continue;
11001
11002 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
11003 }
11004 }
11005 }
11006
11007 if (IsPlayer())
11008 {
11009 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
11010 // Remove infinity cooldown
11011 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
11012 ToPlayer()->SendCooldownEvent(spellInfo);
11013
11014 // xinef: clear spell book
11015 if (m_Controlled.empty())
11017 }
11018
11019 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
11020 {
11022 {
11023 // Check if there is another minion
11024 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
11025 {
11026 // do not use this check, creature do not have charm guid
11027 //if (GetCharmGUID() == (*itr)->GetGUID())
11028 if (GetGUID() == (*itr)->GetCharmerGUID())
11029 continue;
11030
11031 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
11032 if ((*itr)->GetOwnerGUID() != GetGUID())
11033 {
11034 OutDebugInfo();
11035 (*itr)->OutDebugInfo();
11036 ABORT();
11037 }
11038 ASSERT((*itr)->IsCreature());
11039
11040 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
11041 continue;
11042
11043 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
11044 {
11045 // show another pet bar if there is no charm bar
11046 if (IsPlayer() && !GetCharmGUID())
11047 {
11048 if ((*itr)->IsPet())
11050 else
11052 }
11053 }
11054 break;
11055 }
11056 }
11057 }
11058 }
11059}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:46
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:817
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3539
bool IsGuardianPet() const
Definition TemporarySummon.cpp:395
bool IsPetGhoul() const
Definition TemporarySummon.h:95
void PetSpellInitialize()
Definition Player.cpp:9499
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:74
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:20220
ObjectGuid GetCritterGUID() const
Definition Unit.h:715
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10783
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:714
void setPowerType(Powers power)
Definition Unit.cpp:10164
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:11073
uint32 Type
Definition DBCStructure.h:1913

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
754{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10784{
10785 if (GetOwnerGUID() == owner)
10786 return;
10787
10789 if (!owner)
10790 return;
10791
10792 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10793
10794 // Update owner dependent fields
10795 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10796 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10797 return;
10798
10800
10801 UpdateData udata;
10802 WorldPacket packet;
10803 BuildValuesUpdateBlockForPlayer(&udata, player);
10804 udata.BuildPacket(packet);
10805 player->SendDirectMessage(&packet);
10806
10808}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:195
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:194
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11378
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19308{
19309 if (newPhaseMask == GetPhaseMask())
19310 return;
19311
19312 if (IsInWorld())
19313 {
19314 // xinef: to comment, bellow line should be removed
19315 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19316 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19317
19318 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19319 return;
19320
19321 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19322 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19323 {
19324 HostileRefMgr& refMgr = getHostileRefMgr();
19325 HostileReference* ref = refMgr.getFirst();
19326
19327 while (ref)
19328 {
19329 if (Unit* unit = ref->GetSource()->GetOwner())
19330 if (Creature* creature = unit->ToCreature())
19331 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19332
19333 ref = ref->next();
19334 }
19335
19336 // modify threat lists for new phasemask
19337 if (!IsPlayer())
19338 {
19341
19342 // merge expects sorted lists
19343 threatList.sort();
19344 offlineThreatList.sort();
19345 threatList.merge(offlineThreatList);
19346
19347 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19348 if (Unit* unit = (*itr)->getTarget())
19349 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19350 }
19351 }
19352 }
19353
19354 WorldObject::SetPhaseMask(newPhaseMask, false);
19355
19356 if (!IsInWorld())
19357 {
19358 return;
19359 }
19360
19361 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19362 {
19363 Unit* controlled = *itr;
19364 ++itr;
19365 if (controlled->IsCreature())
19366 {
19367 controlled->SetPhaseMask(newPhaseMask, true);
19368 }
19369 }
19370
19371 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19372 {
19373 if (m_SummonSlot[i])
19374 {
19375 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19376 {
19377 summon->SetPhaseMask(newPhaseMask, true);
19378 }
19379 }
19380 }
19381
19382 if (update)
19383 {
19385 }
19386}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:278
Unit * GetOwner() const
Definition ThreatMgr.h:240
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19307
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2910

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_volazj::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15811{
15812 if (!fromRegenerate && GetPower(power) == val)
15813 return;
15814
15815 uint32 maxPower = GetMaxPower(power);
15816 if (maxPower < val)
15817 val = maxPower;
15818
15819 if (fromRegenerate)
15820 {
15823 }
15824 else
15826
15827 if (withPowerUpdate)
15828 {
15829 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15830 data << GetPackGUID();
15831 data << uint8(power);
15832 data << uint32(val);
15833 SendMessageToSet(&data, IsPlayer());
15834 }
15835
15836 // group update
15837 if (IsPlayer())
15838 {
15839 Player* player = ToPlayer();
15840 if (getPowerType() == power && player->NeedSendSpectatorData())
15841 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15842
15843 if (player->GetGroup())
15845 }
15846 else if (Pet* pet = ToCreature()->ToPet())
15847 {
15848 if (pet->isControlled())
15849 {
15850 Unit* owner = GetOwner();
15851 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15853 }
15854
15855 // Update the pet's character sheet with happiness damage bonus
15856 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15857 pet->UpdateDamagePhysical(BASE_ATTACK);
15858 }
15859}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:652
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:513
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10165{
10166 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10167
10168 if (IsPlayer())
10169 {
10170 if (ToPlayer()->GetGroup())
10172 }
10173 else if (Pet* pet = ToCreature()->ToPet())
10174 {
10175 if (pet->isControlled())
10176 {
10177 Unit* owner = GetOwner();
10178 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10180 }
10181 }
10182
10183 float powerMultiplier = 1.0f;
10184 if (!IsPet())
10185 if (Creature* creature = ToCreature())
10186 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10187
10188 switch (new_powertype)
10189 {
10190 default:
10191 case POWER_MANA:
10192 break;
10193 case POWER_RAGE:
10194 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10195 SetPower(POWER_RAGE, 0);
10196 break;
10197 case POWER_FOCUS:
10198 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10199 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10200 break;
10201 case POWER_ENERGY:
10202 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10203 break;
10204 case POWER_HAPPINESS:
10205 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10206 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10207 break;
10208 }
10209
10210 if (Player const* player = ToPlayer())
10211 if (player->NeedSendSpectatorData())
10212 {
10213 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10214 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10215 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10216 }
10217}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15861

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
21123{
21124 if (IsPlayer())
21125 m_race = race;
21126}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
950{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:305

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  stun = false,
bool  logout = false 
)
protected
18470{
18471 const uint32 state = (stun ? (logout ? UNIT_STATE_LOGOUT_TIMER : UNIT_STATE_STUNNED) : UNIT_STATE_ROOT);
18472
18473 if (apply)
18474 {
18475 AddUnitState(state);
18476
18477 SendMoveRoot(true);
18478 }
18479 else
18480 {
18481 ClearUnitState(state);
18482
18483 // Prevent giving ability to move if more immobilizers are active
18484 if (!IsImmobilizedState())
18485 SendMoveRoot(false);
18486 }
18487}
@ UNIT_STATE_LOGOUT_TIMER
Definition UnitDefines.h:202
bool IsImmobilizedState() const
Definition Unit.h:775
void SendMoveRoot(bool state)
Definition Unit.cpp:18489

References AddUnitState(), ClearUnitState(), IsImmobilizedState(), SendMoveRoot(), UNIT_STATE_LOGOUT_TIMER, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21365{
21367 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21368}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14603{
14604 if (rate < 0)
14605 rate = 0.0f;
14606
14607 // Update speed only on change
14608 if (m_speed_rate[mtype] == rate)
14609 return;
14610
14611 m_speed_rate[mtype] = rate;
14612
14614
14615 SpeedOpcodePair const& speedOpcodes = SetSpeed2Opc_table[mtype];
14616
14617 if (forced && IsClientControlled())
14618 {
14619 Player* player = const_cast<Player*>(GetClientControlling());
14620 uint32 const counter = player->GetSession()->GetOrderCounter();
14621
14622 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14623 // and do it only for real sent packets and use run for run/mounted as client expected
14624 ++player->m_forced_speed_changes[mtype];
14625
14626 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::PC)], 18);
14627 data << GetPackGUID();
14628 data << counter;
14629 if (mtype == MOVE_RUN)
14630 data << uint8(0); // new 2.1.0
14631
14632 data << GetSpeed(mtype);
14633 player->GetSession()->SendPacket(&data);
14634 player->GetSession()->IncrementOrderCounter();
14635 }
14636 else if (forced)
14637 {
14638 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::NPC)], 12);
14639 data << GetPackGUID();
14640 data << float(GetSpeed(mtype));
14641 SendMessageToSet(&data, true);
14642 }
14643
14644 if (IsPlayer())
14645 {
14646 // Xinef: update speed of pet also
14647 if (!IsInCombat())
14648 {
14649 Unit* pet = ToPlayer()->GetPet();
14650 if (!pet)
14651 pet = GetCharm();
14652
14653 // xinef: do not affect vehicles and possesed pets
14654 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14655 pet = nullptr;
14656
14657 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14658 pet->UpdateSpeed(mtype, forced);
14659
14660 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14661 critter->UpdateSpeed(mtype, forced);
14662 }
14663 ToPlayer()->SetCanTeleport(true);
14664 }
14665}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
const Opcodes SpeedOpcodePair[static_cast< size_t >(SpeedOpcodeIndex::MAX)]
Definition Unit.h:640
SpeedOpcodePair SetSpeed2Opc_table[MAX_MOVE_TYPE]
Definition Unit.h:641
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:949
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2433
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14597
void propagateSpeedChange()
Definition Unit.h:1725

References FOLLOW_MOTION_TYPE, GetCharm(), GetClientControlling(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetPet(), Player::GetSession(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldSession::IncrementOrderCounter(), IsClientControlled(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), Player::m_forced_speed_changes, m_speed_rate, MOVE_RUN, NPC, PC, propagateSpeedChange(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), Player::SetCanTeleport(), SetSpeed2Opc_table, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_dragonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_mechanolift::npc_mechanolift(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::Reset(), boss_thorim_sif_blizzard::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_ulduar_mimiron_rocket::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16968{
16970
16971 if (IsStandState())
16973
16974 if (IsPlayer())
16975 {
16977 data << (uint8)state;
16978 ToPlayer()->SendDirectMessage(&data);
16979 }
16980}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), Player::SendDirectMessage(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), spell_the_cleansing_cleansing_soul::AfterApply(), spell_the_cleansing_cleansing_soul::AfterRemove(), boss_kologarn::boss_kologarn(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), spell_q12937_relief_for_the_fallen::OnRemove(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), WorldSession::ProcessMovementInfo(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStatFlatModifier()

void Unit::SetStatFlatModifier ( UnitMods  unitMod,
UnitModifierFlatType  modifierType,
float  val 
)

◆ SetStatPctModifier()

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18424{
18425 if (IsInFlight())
18426 return;
18427
18428 if (apply)
18429 {
18430 SetTarget();
18432
18433 if (IsPlayer())
18434 {
18436 }
18437
18438 SetRooted(true, true);
18439
18440 CastStop();
18441 }
18442 else
18443 {
18444 if (IsAlive() && GetVictim())
18446
18447 if (IsCreature())
18448 {
18449 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18450 Unit* owner = GetOwner();
18451 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18453
18454 // Xinef: same for charmed npcs
18455 owner = GetCharmer();
18456 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18458 }
18459 else
18461
18462 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18463 {
18464 SetRooted(false, true);
18465 }
18466 }
18467}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsInFlight(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1946{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21426{
21427 Object::SetUInt32Value(index, value);
21428
21429 switch (index)
21430 {
21431 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21432 // We might also need to invalidate the cache for some other fields as well.
21433 case UNIT_FIELD_HEALTH:
21435 break;
21436 }
21437}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
void InvalidateValuesUpdateCache()
Definition Unit.h:2207

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), WorldSession::ProcessMovementInfo(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::Reset(), npc_ulduar_leviathan_mkii::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::SetData(), npc_ulduar_expedition_engineer::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::UpdateAI(), boss_mimiron::UpdateAI(), npc_ulduar_expedition_engineer::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

738{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::DamageTaken(), boss_freya::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_vx001::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::DoAction(), boss_yoggsaron::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), npc_crystalline_frayer::EnterSeedPod(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), boss_sartharion_dragonAI::HandleExtraEvent(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::JustDied(), boss_algalon_the_observer::JustEngagedWith(), boss_mimiron::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heart(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), boss_flame_leviathan_overload_device::OnSpellClick(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_flame_leviathan::Reset(), npc_ulduar_iron_construct::Reset(), npc_ulduar_leviathan_mkii::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), Player::SetBeastMaster(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_anub_arak::SpellHitTarget(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::UpdateAI(), boss_algalon_the_observer::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_xt002::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21279{
21280 if (slot >= MAX_EQUIPMENT_ITEMS)
21281 return;
21282
21284}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14406{
14407 if (!x)
14409 else
14411
14413}
@ SEC_GAMEMASTER
Definition Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::DoAction(), boss_yoggsaron::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::InitializeAI(), npc_xt002_heart::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::Reset(), boss_yoggsaron_sara::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20545{
20546 if (enable == IsWalking())
20547 return false;
20548
20549 if (enable)
20551 else
20553
20555 return true;
20556}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

void Unit::SetWaterWalking ( bool  enable)
20749{
20750 bool isClientControlled = IsClientControlled();
20751
20752 if (!isClientControlled)
20753 {
20754 if (enable)
20756 else
20758 }
20759
20760 if (!IsInWorld()) // is sent on add to map
20761 return;
20762
20763 if (isClientControlled)
20764 {
20765 if (Player const* player = GetClientControlling())
20766 {
20767 uint32 const counter = player->GetSession()->GetOrderCounter();
20768
20769 WorldPacket data(enable ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
20770 data << GetPackGUID();
20771 data << counter;
20772 player->SendDirectMessage(&data);
20773 player->GetSession()->IncrementOrderCounter();
20774 return;
20775 }
20776 }
20777
20779 data << GetPackGUID();
20780 SendMessageToSet(&data, true);
20781}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:397
@ SMSG_MOVE_LAND_WALK
Definition Opcodes.h:253
@ SMSG_SPLINE_MOVE_LAND_WALK
Definition Opcodes.h:808
@ SMSG_MOVE_WATER_WALK
Definition Opcodes.h:252

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_WATERWALKING, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_LAND_WALK, SMSG_MOVE_WATER_WALK, SMSG_SPLINE_MOVE_LAND_WALK, and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::BuildPlayerRepop(), AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), cheat_commandscript::HandleWaterWalkCheatCommand(), and Player::ResurrectPlayer().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12146{
12147 int32 DoneAdvertisedBenefit = GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_DONE, [schoolMask](AuraEffect const* aurEff)
12148 {
12149 return aurEff->GetMiscValue() & schoolMask &&
12150 // -1 == any item class (not wand then)
12151 aurEff->GetSpellInfo()->EquippedItemClass == -1 &&
12152 // 0 == any inventory type (not wand then)
12154 });
12155
12156 if (IsPlayer())
12157 {
12158 // Base value
12159 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12160 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellDamageBonus();
12161
12162 // Damage bonus from stats
12164 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12165 {
12166 if ((*i)->GetMiscValue() & schoolMask)
12167 {
12168 // stat used stored in miscValueB for this aura
12169 Stats usedStat = Stats((*i)->GetMiscValueB());
12170 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12171 }
12172 }
12173 // ... and attack power
12175 }
12176 return DoneAdvertisedBenefit;
12177}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1987
uint32 GetBaseSpellDamageBonus()
Definition Player.h:1988
int32 EquippedItemInventoryTypeMask
Definition SpellInfo.h:377

References BASE_ATTACK, CalculatePct(), SpellInfo::EquippedItemClass, SpellInfo::EquippedItemInventoryTypeMask, GetAuraEffectsByType(), Player::GetBaseSpellDamageBonus(), Player::GetBaseSpellPowerBonus(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), GetStat(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12180{
12181 return GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_TAKEN, [schoolMask, isDoT](AuraEffect const* aurEff)
12182 {
12183 return (aurEff->GetMiscValue() & schoolMask) != 0
12184 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12185 // Xinef: required for hemorrhage & rupture / garrote
12186 && !(isDoT && aurEff->GetBase()->IsUsingCharges() && aurEff->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC);
12187 });
12188}
bool IsUsingCharges() const
Definition SpellAuras.h:201

References AuraEffect::GetBase(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), GetTotalAuraModifier(), Aura::IsUsingCharges(), PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcFlags, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12892{
12893 int32 AdvertisedBenefit = 0;
12894
12895 AdvertisedBenefit += GetTotalAuraModifier(SPELL_AURA_MOD_HEALING_DONE, [schoolMask](AuraEffect const* aurEff)
12896 {
12897 return !aurEff->GetMiscValue() || (aurEff->GetMiscValue() & schoolMask) != 0;
12898 });
12899
12900 // Healing bonus of spirit, intellect and strength
12901 if (IsPlayer())
12902 {
12903 // Base value
12904 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12905 AdvertisedBenefit += ToPlayer()->GetBaseSpellHealingBonus();
12906
12907 // Healing bonus from stats
12909 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12910 {
12911 // stat used dependent from misc value (stat index)
12912 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12913 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12914 }
12915
12916 // ... and attack power
12918 }
12919 return AdvertisedBenefit;
12920}
@ SPELL_AURA_MOD_HEALING_DONE
Definition SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition SpellAuraDefines.h:301
uint32 GetBaseSpellHealingBonus()
Definition Player.h:1989

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellHealingBonus(), Player::GetBaseSpellPowerBonus(), AuraEffect::GetMiscValue(), GetStat(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12474{
12475 // Calculate critical bonus
12476 int32 crit_bonus = damage;
12477 float crit_mod = 0.0f;
12478
12479 switch (spellProto->DmgClass)
12480 {
12481 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12484 crit_bonus += damage;
12485 break;
12486 default:
12487 crit_bonus += damage / 2; // for spells is 50%
12488 break;
12489 }
12490
12491 if (caster)
12492 {
12493 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12494
12495 if (victim)
12496 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12497
12498 if (crit_bonus != 0 && crit_mod != 0.0f)
12499 AddPct(crit_bonus, crit_mod);
12500
12501 crit_bonus -= damage;
12502
12503 // adds additional damage to critBonus (from talents)
12504 if (Player* modOwner = caster->GetSpellModOwner())
12505 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12506
12507 crit_bonus += damage;
12508 }
12509
12510 return crit_bonus;
12511}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12514{
12515 // Calculate critical bonus
12516 int32 crit_bonus;
12517 switch (spellProto->DmgClass)
12518 {
12519 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12522 crit_bonus = damage;
12523 break;
12524 default:
12525 crit_bonus = damage / 2; // for spells is 50%
12526 break;
12527 }
12528
12529 if (caster)
12530 {
12531 if (victim)
12532 {
12533 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12534 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12535 }
12536
12537 // adds additional damage to critBonus (from talents)
12538 // xinef: used for death knight death coil
12539 if (Player* modOwner = caster->GetSpellModOwner())
12540 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12541 }
12542
12543 if (crit_bonus > 0)
12544 damage += crit_bonus;
12545
12546 if (caster)
12547 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12548
12549 return damage;
12550}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11826{
11827 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11828 return pdamage;
11829
11830 // Some spells don't benefit from done mods
11831 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11832 return pdamage;
11833
11834 // For totems get damage bonus from owner
11835 if (IsCreature())
11836 {
11837 if (IsTotem())
11838 {
11839 if (Unit* owner = GetOwner())
11840 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11841 }
11842 // Dancing Rune Weapon...
11843 else if (GetEntry() == 27893)
11844 {
11845 if (Unit* owner = GetOwner())
11846 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11847 }
11848 }
11849
11850 // Done total percent damage auras
11851 float ApCoeffMod = 1.0f;
11852 int32 DoneTotal = 0;
11853 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11854
11855 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11857 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11858
11859 // Some spells don't benefit from pct done mods
11860 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11861 {
11862 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11863 // Add flat bonus from spell damage versus
11865 }
11866
11867 // done scripted mod (take it from owner)
11868 Unit* owner = GetOwner() ? GetOwner() : this;
11869 int32 DoneAdvertisedBenefit = 0;
11870 DoneAdvertisedBenefit += owner->GetTotalAuraModifier(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, [spellProto](AuraEffect const* aurEff)
11871 {
11872 if (!aurEff->IsAffectedOnSpell(spellProto))
11873 return false;
11874
11875 switch (aurEff->GetMiscValue())
11876 {
11877 case 4418: // Increased Shock Damage
11878 case 4554: // Increased Lightning Damage
11879 case 4555: // Improved Moonfire
11880 case 5142: // Increased Lightning Damage
11881 case 5147: // Improved Consecration / Libram of Resurgence
11882 case 5148: // Idol of the Shooting Star
11883 case 6008: // Increased Lightning Damage
11884 case 8627: // Totem of Hex
11885 return true;
11886 break;
11887 default:
11888 break;
11889 }
11890
11891 return false;
11892 });
11893
11894 // Custom scripted damage
11895 switch (spellProto->SpellFamilyName)
11896 {
11897 case SPELLFAMILY_DRUID:
11898 {
11899 // Insect Swarm vs Item - Druid T8 Balance Relic
11900 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11901 {
11902 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11903 {
11904 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11905 }
11906 }
11907
11908 // Nourish vs Idol of the Flourishing Life
11909 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11910 {
11911 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11912 {
11913 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11914 }
11915 }
11916 break;
11917 }
11919 {
11920 // Sigil of the Vengeful Heart
11921 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11922 {
11923 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11924 {
11925 AddPct(DoneTotal, aurEff->GetAmount());
11926 }
11927 }
11928
11929 // Impurity
11931 {
11932 AddPct(ApCoeffMod, aurEff->GetAmount());
11933 }
11934
11935 // Blood Boil - bonus for diseased targets
11936 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11937 {
11938 DoneTotal += 95;
11939 ApCoeffMod = 1.5835f;
11940 }
11941 break;
11942 }
11943 default:
11944 break;
11945 }
11946
11947 // Done fixed damage bonus auras
11948 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11949
11950 // Check for table values
11951 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11952 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11953 if (bonus)
11954 {
11955 if (damagetype == DOT)
11956 {
11957 coeff = bonus->dot_damage;
11958 if (bonus->ap_dot_bonus > 0)
11959 {
11960 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11962 APbonus += GetTotalAttackPowerValue(attType);
11963 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11964 }
11965 }
11966 else
11967 {
11968 coeff = bonus->direct_damage;
11969 if (bonus->ap_bonus > 0)
11970 {
11971 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11973 APbonus += GetTotalAttackPowerValue(attType);
11974 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11975 }
11976 }
11977 }
11978
11979 // Default calculation
11980 if (coeff && DoneAdvertisedBenefit)
11981 {
11982 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11983
11984 if (Player* modOwner = GetSpellModOwner())
11985 {
11986 coeff *= 100.0f;
11987 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11988 coeff /= 100.0f;
11989 }
11990
11991 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11992 }
11993
11994 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11995 // apply spellmod to Done damage (flat and pct)
11996 if (Player* modOwner = GetSpellModOwner())
11997 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11998
11999 return uint32(std::max(tmpDamage, 0.0f));
12000}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:644
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1572
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11497
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3074
Definition SpellMgr.h:324
float ap_dot_bonus
Definition SpellMgr.h:328
float dot_damage
Definition SpellMgr.h:326
float ap_bonus
Definition SpellMgr.h:327
float direct_damage
Definition SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, AuraEffect::GetAmount(), GetAuraEffect(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), AuraEffect::GetMiscValue(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12003{
12004 if (!spellProto || damagetype == DIRECT_DAMAGE)
12005 return pdamage;
12006
12007 int32 TakenTotal = 0;
12008 float TakenTotalMod = 1.0f;
12009
12010 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
12011 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
12012 TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask());
12013
12014 TakenTotalMod = processDummyAuras(TakenTotalMod);
12015
12016 // From caster spells
12017 if (caster)
12018 {
12019 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, [caster, spellProto](AuraEffect const* aurEff) -> bool
12020 {
12021 if (aurEff->GetCasterGUID() == caster->GetGUID() && aurEff->IsAffectedOnSpell(spellProto))
12022 return true;
12023 return false;
12024 });
12025 }
12026
12027 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
12028 {
12029 int32 modifierMax = 0;
12030 int32 modifierMin = 0;
12032 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
12033 {
12034 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
12035 continue;
12036
12037 // Only death knight spell with this aura
12038 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
12039 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
12040 continue;
12041
12042 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
12043 {
12044 if ((*i)->GetAmount() > 0)
12045 {
12046 if ((*i)->GetAmount() > modifierMax)
12047 modifierMax = (*i)->GetAmount();
12048 }
12049 else if ((*i)->GetAmount() < modifierMin)
12050 modifierMin = (*i)->GetAmount();
12051 }
12052 }
12053
12054 AddPct(TakenTotalMod, modifierMax);
12055 AddPct(TakenTotalMod, modifierMin);
12056 }
12057
12058 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
12059
12060 // Check for table values
12061 float coeff = 0;
12062 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12063 if (bonus)
12064 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12065
12066 // Default calculation
12067 if (TakenAdvertisedBenefit)
12068 {
12069 if (coeff <= 0.0f)
12070 {
12071 if (caster)
12072 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
12073 else
12074 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
12075 }
12076
12077 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12078 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
12079 }
12080
12081 // No positive taken bonus, custom attr
12082 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
12083 {
12084 TakenTotal = 0;
12085 TakenTotalMod = 1.0f;
12086 }
12087
12088 // xinef: sanctified wrath talent
12089 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
12090 {
12091 float ignoreModifier = 1.0f - TakenTotalMod;
12092 bool addModifier = false;
12094 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
12095 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
12096 {
12097 ApplyPct(ignoreModifier, (*j)->GetAmount());
12098 addModifier = true;
12099 }
12100
12101 if (addModifier)
12102 TakenTotalMod += ignoreModifier;
12103 }
12104
12105 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
12106
12107 return uint32(std::max(tmpDamage, 0.0f));
12108}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17449

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), SpellInfo::GetSchoolMask(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealDamageShieldDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12191{
12192 // Mobs can't crit with spells.
12193 if (IsCreature() && !GetSpellModOwner())
12194 return -100.0f;
12195
12196 // not critting spell
12197 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12198 return 0.0f;
12199
12200 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12201 if (!skipEffectCheck && !spellProto->IsCritCapable())
12202 return 0.0f;
12203
12204 float crit_chance = 0.0f;
12205 switch (spellProto->DmgClass)
12206 {
12208 {
12209 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12210 crit_chance = 0.0f;
12211 // For other schools
12212 else if (IsPlayer())
12213 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12214 else
12215 {
12216 crit_chance = (float)m_baseSpellCritChance;
12218 }
12219 break;
12220 }
12223 {
12224 if (IsPlayer())
12225 {
12226 switch (attackType)
12227 {
12228 case BASE_ATTACK:
12230 break;
12231 case OFF_ATTACK:
12233 break;
12234 case RANGED_ATTACK:
12236 break;
12237 default:
12238 break;
12239 }
12240 }
12241 else
12242 {
12243 crit_chance = 5.0f;
12246 }
12248 break;
12249 }
12250 // values overridden in spellmgr for lifebloom and earth shield
12252 default:
12253 return 0.0f;
12254 }
12255
12256 // percent done
12257 // only players use intelligence for critical chance computations
12258 if (Player* modOwner = GetSpellModOwner())
12259 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12260
12261 // xinef: can be negative!
12262 return crit_chance;
12263}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:496
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12638{
12639 // For totems get healing bonus from owner (statue isn't totem in fact)
12640 if (IsCreature() && IsTotem())
12641 if (Unit* owner = GetOwner())
12642 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12643
12644 // No bonus healing for potion spells
12645 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12646 return healamount;
12647
12648 float ApCoeffMod = 1.0f;
12649 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12650 int32 DoneTotal = 0;
12651
12652 // done scripted mod (take it from owner)
12653 Unit* owner = GetOwner() ? GetOwner() : this;
12654 int32 DoneAdvertisedBenefit = 0;
12655 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12656 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12657 {
12658 if (!(*i)->IsAffectedOnSpell(spellProto))
12659 continue;
12660
12661 switch ((*i)->GetMiscValue())
12662 {
12663 case 4415: // Increased Rejuvenation Healing
12664 case 4953:
12665 DoneAdvertisedBenefit += (*i)->GetAmount();
12666 break;
12667 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12668 DoneAdvertisedBenefit += (*i)->GetAmount();
12669 break;
12670 }
12671 }
12672
12673 switch (spellProto->SpellFamilyName)
12674 {
12676 {
12677 // Impurity
12679 {
12680 AddPct(ApCoeffMod, aurEff->GetAmount());
12681 }
12682 break;
12683 }
12684 default:
12685 break;
12686 }
12687
12688 // Done fixed damage bonus auras
12689 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12690 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12691
12692 // Check for table values
12693 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12694 if (bonus)
12695 {
12696 if (damagetype == DOT)
12697 {
12698 coeff = bonus->dot_damage;
12699 if (bonus->ap_dot_bonus > 0)
12700 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12701 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12702 }
12703 else
12704 {
12705 coeff = bonus->direct_damage;
12706 if (bonus->ap_bonus > 0)
12707 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12708 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12709 }
12710 }
12711 else
12712 {
12713 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12714 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12715 return healamount;
12716 }
12717
12718 // Default calculation
12719 if (DoneAdvertisedBenefit)
12720 {
12721 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12722 if (Player* modOwner = GetSpellModOwner())
12723 {
12724 coeff *= 100.0f;
12725 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12726 coeff /= 100.0f;
12727 }
12728 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12729 }
12730
12731 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12732 {
12733 switch (spellProto->Effects[i].ApplyAuraName)
12734 {
12735 // Bonus healing does not apply to these spells
12738 DoneTotal = 0;
12739 break;
12740 default:
12741 break;
12742 }
12743 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12744 DoneTotal = 0;
12745 }
12746
12747 // use float as more appropriate for negative values and percent applying
12748 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12749 // apply spellmod to Done amount
12750
12751 if (Player* modOwner = GetSpellModOwner())
12752 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12753
12754 return uint32(std::max(heal, 0.0f));
12755}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12891
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12552

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12758{
12759 float TakenTotalMod = 1.0f;
12760 float minval = 0.0f;
12761
12762 // Healing taken percent
12763 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12764 {
12766 }
12767
12768 if (minval)
12769 AddPct(TakenTotalMod, minval);
12770
12772 if (maxval)
12773 AddPct(TakenTotalMod, maxval);
12774
12775 // Tenacity increase healing % taken
12776 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12777 AddPct(TakenTotalMod, Tenacity->GetAmount());
12778
12779 // Healing Done
12780 int32 TakenTotal = 0;
12781
12782 // Taken fixed damage bonus auras
12783 int32 TakenAdvertisedBenefit = GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_HEALING, spellProto->GetSchoolMask());
12784
12785 // Nourish cast, glyph of nourish
12786 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12787 {
12788 bool any = false;
12789 bool hasglyph = caster->GetAuraEffectDummy(62971);
12791 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12792 {
12793 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12794 {
12795 SpellInfo const* spell = (*i)->GetSpellInfo();
12796 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12797 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12798 {
12799 TakenTotalMod *= 1.2f;
12800 any = true;
12801 }
12802
12803 if (hasglyph)
12804 TakenTotalMod += 0.06f;
12805 }
12806 }
12807 }
12808
12809 if (damagetype == DOT)
12810 {
12811 // Healing over time taken percent
12812 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12813 if (minval_hot)
12814 AddPct(TakenTotalMod, minval_hot);
12815
12816 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12817 if (maxval_hot)
12818 AddPct(TakenTotalMod, maxval_hot);
12819 }
12820
12821 // Check for table values
12822 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12823 float coeff = 0;
12824 float factorMod = 1.0f;
12825 if (bonus)
12826 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12827 else
12828 {
12829 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12830 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12831 {
12832 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12833 return healamount;
12834 }
12835 }
12836
12837 // Default calculation
12838 if (TakenAdvertisedBenefit)
12839 {
12840 float TakenCoeff = 0.0f;
12841 if (coeff <= 0)
12842 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12843
12844 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12845 if (Player* modOwner = GetSpellModOwner())
12846 {
12847 coeff *= 100.0f;
12848 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12849 coeff /= 100.0f;
12850 }
12851
12852 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12853 }
12854
12855 if (caster)
12856 {
12857 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto](AuraEffect const* aurEff)
12858 {
12859 return caster->GetGUID() == aurEff->GetCasterGUID() && aurEff->IsAffectedOnSpell(spellProto);
12860 });
12861 }
12862
12863 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12864 {
12865 switch (spellProto->Effects[i].ApplyAuraName)
12866 {
12867 // Bonus healing does not apply to these spells
12870 TakenTotal = 0;
12871 break;
12872 default:
12873 break;
12874 }
12875 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12876 TakenTotal = 0;
12877 }
12878
12879 // No positive taken bonus, custom attr
12880 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12881 {
12882 TakenTotal = 0;
12883 TakenTotalMod = 1.0f;
12884 }
12885
12886 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12887
12888 return uint32(std::max(heal, 0.0f));
12889}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:642
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition SpellAuraDefines.h:322
@ SPELL_AURA_MOD_HEALING
Definition SpellAuraDefines.h:178

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), spell_pal_lay_on_hands::HandleMaxHealthHeal(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3568{
3569 SpellInfo const* spellInfo = spell->GetSpellInfo();
3570
3571 // Check for immune
3572 if (victim->IsImmunedToSpell(spellInfo, spell))
3573 {
3574 return SPELL_MISS_IMMUNE;
3575 }
3576
3577 // All positive spells can`t miss
3579 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3580 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3581 {
3582 return SPELL_MISS_NONE;
3583 }
3584
3585 // Check for immune
3586 // xinef: check for school immunity only
3587 if (victim->IsImmunedToSchool(spell))
3588 {
3589 return SPELL_MISS_IMMUNE;
3590 }
3591
3592 if (this == victim)
3593 {
3594 return SPELL_MISS_NONE;
3595 }
3596
3597 // Return evade for units in evade mode
3598 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3600 {
3601 return SPELL_MISS_EVADE;
3602 }
3603
3604 // Try victim reflect spell
3605 if (CanReflect)
3606 {
3607 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3609
3610 if (reflectchance > 0 && roll_chance_i(reflectchance))
3611 {
3612 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3613 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3614 return SPELL_MISS_REFLECT;
3615 }
3616 }
3617
3618 switch (spellInfo->DmgClass)
3619 {
3622 return MeleeSpellHitResult(victim, spellInfo);
3624 {
3625 if (spellInfo->SpellFamilyName)
3626 {
3627 return SPELL_MISS_NONE;
3628 }
3629
3630 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3631 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3632 {
3633 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3634 {
3635 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3636 {
3637 return SPELL_MISS_NONE;
3638 }
3639 }
3640 }
3641 [[fallthrough]];
3642 }
3644 return MagicSpellHitResult(victim, spellInfo);
3645 }
3646
3647 return SPELL_MISS_NONE;
3648}
@ SPELL_EFFECT_DISPEL
Definition SharedDefines.h:827
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1537
@ SPELL_MISS_EVADE
Definition SharedDefines.h:1536
@ SPELL_MISS_REFLECT
Definition SharedDefines.h:1541
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3361
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3188

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellInfo(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3505{
3506 // Check for immune
3507 if (victim->IsImmunedToSpell(spell))
3508 return SPELL_MISS_IMMUNE;
3509
3510 // All positive spells can`t miss
3512 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3513 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3514 return SPELL_MISS_NONE;
3515
3516 // Check for immune
3517 // xinef: check for school immunity only
3518 if (victim->IsImmunedToSchool(spell))
3519 return SPELL_MISS_IMMUNE;
3520
3521 if (this == victim)
3522 return SPELL_MISS_NONE;
3523
3524 // Return evade for units in evade mode
3525 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3526 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3527 return SPELL_MISS_EVADE;
3528
3529 // Try victim reflect spell
3530 if (CanReflect)
3531 {
3532 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3533 reflectchance += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_REFLECT_SPELLS_SCHOOL, spell->GetSchoolMask());
3534
3535 if (reflectchance > 0 && roll_chance_i(reflectchance))
3536 {
3537 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3538 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3539 return SPELL_MISS_REFLECT;
3540 }
3541 }
3542
3543 switch (spell->DmgClass)
3544 {
3547 return MeleeSpellHitResult(victim, spell);
3549 {
3550 if (spell->SpellFamilyName)
3551 {
3552 return SPELL_MISS_NONE;
3553 }
3554 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3555 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3556 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3557 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3558 return SPELL_MISS_NONE;
3559 [[fallthrough]];
3560 }
3562 return MagicSpellHitResult(victim, spell);
3563 }
3564 return SPELL_MISS_NONE;
3565}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealDamageShieldDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11498{
11499 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11500 return 1.0f;
11501
11502 // Some spells don't benefit from done mods
11503 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11504 return 1.0f;
11505
11506 // For totems get damage bonus from owner
11507 if (IsCreature())
11508 {
11509 if (IsTotem())
11510 {
11511 if (Unit* owner = GetOwner())
11512 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11513 }
11514 // Dancing Rune Weapon...
11515 else if (GetEntry() == 27893)
11516 {
11517 if (Unit* owner = GetOwner())
11518 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11519 }
11520 }
11521
11522 // Done total percent damage auras
11523 float DoneTotalMod = 1.0f;
11524
11525 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [spellProto, this, damagetype](AuraEffect const* aurEff)
11526 {
11527 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11528 if (spellProto->EquippedItemClass == -1 && aurEff->GetSpellInfo()->EquippedItemClass != -1 &&
11530 {
11531 return false;
11532 }
11533
11534 if (!spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT))
11535 return false;
11536
11537 if (aurEff->GetMiscValue() & spellProto->GetSchoolMask())
11538 {
11539 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
11540 return true;
11542 return true;
11543 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
11544 return true;
11545 }
11546 return false;
11547 });
11548
11549 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11550 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, [creatureTypeMask, spellProto, damagetype, this](AuraEffect const* aurEff)
11551 {
11552 return creatureTypeMask & aurEff->GetMiscValue() && spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT);
11553 });
11554
11555 // bonus against aurastate
11556 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, [victim, spellProto, damagetype, this](AuraEffect const* aurEff)
11557 {
11558 return victim->HasAuraState(AuraStateType(aurEff->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT);
11559 });
11560
11561 // done scripted mod (take it from owner)
11562 Unit* owner = GetOwner() ? GetOwner() : this;
11563 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11564 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11565 {
11566 // Xinef: self cast is ommited (because of Rage of Rivendare)
11567 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11568 continue;
11569
11570 // xinef: Molten Fury should work on all spells
11571 switch ((*i)->GetMiscValue())
11572 {
11573 case 4920: // Molten Fury
11574 case 4919:
11575 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11576 AddPct(DoneTotalMod, (*i)->GetAmount());
11577 break;
11578 }
11579
11580 if (!(*i)->IsAffectedOnSpell(spellProto))
11581 continue;
11582
11583 switch ((*i)->GetMiscValue())
11584 {
11585 case 6917: // Death's Embrace
11586 case 6926:
11587 case 6928:
11588 {
11589 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11590 AddPct(DoneTotalMod, (*i)->GetAmount());
11591 break;
11592 }
11593 // Soul Siphon
11594 case 4992:
11595 case 4993:
11596 {
11597 // effect 1 m_amount
11598 int32 maxPercent = (*i)->GetAmount();
11599 // effect 0 m_amount
11600 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11601 // count affliction effects and calc additional damage in percentage
11602 int32 modPercent = 0;
11603 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11604 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11605 {
11606 Aura const* aura = itr->second->GetBase();
11607 SpellInfo const* m_spell = aura->GetSpellInfo();
11608 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11609 continue;
11610 modPercent += stepPercent * aura->GetStackAmount();
11611 if (modPercent >= maxPercent)
11612 {
11613 modPercent = maxPercent;
11614 break;
11615 }
11616 }
11617 AddPct(DoneTotalMod, modPercent);
11618 break;
11619 }
11620 case 6916: // Death's Embrace
11621 case 6925:
11622 case 6927:
11623 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11624 AddPct(DoneTotalMod, (*i)->GetAmount());
11625 break;
11626 case 5481: // Starfire Bonus
11627 {
11628 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11629 AddPct(DoneTotalMod, (*i)->GetAmount());
11630 break;
11631 }
11632 // Tundra Stalker
11633 // Merciless Combat
11634 case 7277:
11635 {
11636 // Merciless Combat
11637 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11638 {
11639 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11640 if (!victim->HealthAbovePct(35))
11641 AddPct(DoneTotalMod, (*i)->GetAmount());
11642 }
11643 // Tundra Stalker
11644 else
11645 {
11646 // Frost Fever (target debuff)
11647 if (victim->HasAura(55095))
11648 AddPct(DoneTotalMod, (*i)->GetAmount());
11649 break;
11650 }
11651 break;
11652 }
11653 // Rage of Rivendare
11654 case 7293:
11655 {
11657 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11658 break;
11659 }
11660 // Twisted Faith
11661 case 7377:
11662 {
11664 AddPct(DoneTotalMod, (*i)->GetAmount());
11665 break;
11666 }
11667 // Marked for Death
11668 case 7598:
11669 case 7599:
11670 case 7600:
11671 case 7601:
11672 case 7602:
11673 {
11674 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11675 AddPct(DoneTotalMod, (*i)->GetAmount());
11676 break;
11677 }
11678 // Dirty Deeds
11679 case 6427:
11680 case 6428:
11681 case 6579:
11682 case 6580:
11683 {
11684 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11685 {
11686 // effect 0 has expected value but in negative state
11687 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11688 AddPct(DoneTotalMod, bonus);
11689 }
11690 break;
11691 }
11692 }
11693 }
11694
11695 // Custom scripted damage
11696 switch (spellProto->SpellFamilyName)
11697 {
11698 case SPELLFAMILY_MAGE:
11699 // Ice Lance
11700 if (spellProto->SpellIconID == 186)
11701 {
11702 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11703 {
11704 // Glyph of Ice Lance
11705 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11706 DoneTotalMod *= 4.0f;
11707 else
11708 DoneTotalMod *= 3.0f;
11709 }
11710 }
11711
11712 // Torment the weak
11713 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11714 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11716 AddPct(DoneTotalMod, aurEff->GetAmount());
11717 break;
11718 case SPELLFAMILY_PRIEST:
11719 // Mind Flay
11720 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11721 {
11722 // Glyph of Shadow Word: Pain
11723 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11724 // Increase Mind Flay damage if Shadow Word: Pain present on target
11726 AddPct(DoneTotalMod, aurEff->GetAmount());
11727
11728 // Twisted Faith - Mind Flay part
11730 // Increase Mind Flay damage if Shadow Word: Pain present on target
11732 AddPct(DoneTotalMod, aurEff->GetAmount());
11733 }
11734 // Smite
11735 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11736 {
11737 // Glyph of Smite
11738 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11739 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11740 AddPct(DoneTotalMod, aurEff->GetAmount());
11741 }
11742 // Shadow Word: Death
11743 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11744 {
11745 // Glyph of Shadow Word: Death
11746 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11748 AddPct(DoneTotalMod, aurEff->GetAmount());
11749 }
11750
11751 break;
11753 // Judgement of Vengeance/Judgement of Corruption
11754 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11755 {
11756 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11757 uint32 stacks = 0;
11759 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11760 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11761 {
11762 stacks = (*itr)->GetBase()->GetStackAmount();
11763 break;
11764 }
11765 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11766 if (stacks)
11767 AddPct(DoneTotalMod, 10 * stacks);
11768 }
11769 break;
11770 case SPELLFAMILY_DRUID:
11771 // Thorns
11772 if (spellProto->SpellFamilyFlags[0] & 0x100)
11773 {
11774 // Brambles
11775 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11776 AddPct(DoneTotalMod, aurEff->GetAmount());
11777 }
11778 break;
11780 // Fire and Brimstone
11781 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11783 {
11785 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11786 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11787 {
11788 AddPct(DoneTotalMod, (*i)->GetAmount());
11789 break;
11790 }
11791 }
11792 // Drain Soul - increased damage for targets under 25 % HP
11793 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11794 if (!victim->HealthAbovePct(25))
11795 DoneTotalMod *= 4;
11796 // Shadow Bite (15% increase from each dot)
11797 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11798 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11799 AddPct(DoneTotalMod, 15 * count);
11800 break;
11801 case SPELLFAMILY_HUNTER:
11802 // Steady Shot
11803 if (spellProto->SpellFamilyFlags[1] & 0x1)
11804 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11805 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11806 AddPct(DoneTotalMod, aurEff->GetAmount());
11807 break;
11809 // Improved Icy Touch
11810 if (spellProto->SpellFamilyFlags[0] & 0x2)
11812 AddPct(DoneTotalMod, aurEff->GetAmount());
11813
11814 // Glacier Rot
11815 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11817 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11818 AddPct(DoneTotalMod, aurEff->GetAmount());
11819 break;
11820 }
11821
11822 return DoneTotalMod;
11823}
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:594
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1344
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1317
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5970
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5941
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:6024

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, AuraEffect::GetAmount(), GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), AuraEffect::GetMiscValue(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12553{
12554 // For totems get healing bonus from owner (statue isn't totem in fact)
12555 if (IsCreature() && IsTotem())
12556 if (Unit* owner = GetOwner())
12557 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12558
12559 // Some spells don't benefit from done mods
12560 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12561 return 1.0f;
12562
12563 // xinef: Some spells don't benefit from done mods
12564 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12565 return 1.0f;
12566
12567 // No bonus healing for potion spells
12568 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12569 return 1.0f;
12570
12571 float DoneTotalMod = 1.0f;
12572
12573 // Healing done percent
12575
12576 // done scripted mod (take it from owner)
12577 Unit* owner = GetOwner() ? GetOwner() : this;
12578 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12579 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12580 {
12581 if (!(*i)->IsAffectedOnSpell(spellProto))
12582 continue;
12583
12584 switch ((*i)->GetMiscValue())
12585 {
12586 case 21: // Test of Faith
12587 case 6935:
12588 case 6918:
12589 if (victim->HealthBelowPct(50))
12590 AddPct(DoneTotalMod, (*i)->GetAmount());
12591 break;
12592 case 7798: // Glyph of Regrowth
12593 {
12595 AddPct(DoneTotalMod, (*i)->GetAmount());
12596 break;
12597 }
12598
12599 case 7871: // Glyph of Lesser Healing Wave
12600 {
12601 // xinef: affected by any earth shield
12602 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12603 AddPct(DoneTotalMod, (*i)->GetAmount());
12604 break;
12605 }
12606 default:
12607 break;
12608 }
12609 }
12610
12611 switch (spellProto->SpellFamilyName)
12612 {
12614 // Talents and glyphs for healing stream totem
12615 if (spellProto->Id == 52042)
12616 {
12617 // Glyph of Healing Stream Totem
12618 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12619 AddPct(DoneTotalMod, dummy->GetAmount());
12620
12621 // Healing Stream totem - Restorative Totems
12622 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12623 AddPct(DoneTotalMod, aurEff->GetAmount());
12624 }
12625 break;
12626 case SPELLFAMILY_PRIEST:
12627 // T9 HEALING 4P, empowered renew instant heal
12628 if (spellProto->Id == 63544)
12629 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12630 AddPct(DoneTotalMod, aurEff->GetAmount());
12631 break;
12632 }
12633
12634 return DoneTotalMod;
12635}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12266{
12267 // not critting spell
12268 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12269 return 0.0f;
12270
12271 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12272 if (!skipEffectCheck && !spellProto->IsCritCapable())
12273 return 0.0f;
12274
12275 float crit_chance = doneChance;
12276 switch (spellProto->DmgClass)
12277 {
12279 {
12280 if (!spellProto->IsPositive())
12281 {
12282 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12283 // xinef: apply max and min only
12285 {
12288 }
12289
12290 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12291 }
12292 // scripted (increase crit chance ... against ... target by x%
12293 if (caster)
12294 {
12295 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12296 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12297 {
12298 if (!((*i)->IsAffectedOnSpell(spellProto)))
12299 continue;
12300 int32 modChance = 0;
12301 switch ((*i)->GetMiscValue())
12302 {
12303 // Shatter
12304 case 911:
12305 modChance += 16;
12306 [[fallthrough]];
12307 case 910:
12308 modChance += 17;
12309 [[fallthrough]];
12310 case 849:
12311 modChance += 17;
12312 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12313 break;
12314 crit_chance += modChance;
12315 break;
12316 case 7917: // Glyph of Shadowburn
12317 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12318 crit_chance += (*i)->GetAmount();
12319 break;
12320 case 7997: // Renewed Hope
12321 case 7998:
12322 if (HasAura(6788))
12323 crit_chance += (*i)->GetAmount();
12324 break;
12325 default:
12326 break;
12327 }
12328 }
12329 // Custom crit by class
12330 switch (spellProto->SpellFamilyName)
12331 {
12332 case SPELLFAMILY_MAGE:
12333 // Glyph of Fire Blast
12334 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12336 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12337 crit_chance += aurEff->GetAmount();
12338 break;
12339 case SPELLFAMILY_DRUID:
12340 // Improved Faerie Fire
12342 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12343 crit_chance += aurEff->GetAmount();
12344
12345 // cumulative effect - don't break
12346
12347 // Starfire
12348 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12349 {
12350 // Improved Insect Swarm
12351 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12353 crit_chance += aurEff->GetAmount();
12354 break;
12355 }
12356 break;
12357 case SPELLFAMILY_ROGUE:
12358 // Shiv-applied poisons can't crit
12359 if (caster->FindCurrentSpellBySpellId(5938))
12360 crit_chance = 0.0f;
12361 break;
12363 // Flash of light
12364 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12365 {
12366 // Sacred Shield
12367 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12368 crit_chance += aura->GetAmount();
12369 break;
12370 }
12371 // Exorcism
12372 else if (spellProto->GetCategory() == 19)
12373 {
12375 return 100.0f;
12376 break;
12377 }
12378 break;
12379 case SPELLFAMILY_SHAMAN:
12380 // Lava Burst
12381 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12382 {
12383 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12385 return 100.0f;
12386 break;
12387 }
12388 break;
12389 }
12390 }
12391 break;
12392 }
12394 // Custom crit by class
12395 if (caster)
12396 {
12397 switch (spellProto->SpellFamilyName)
12398 {
12399 case SPELLFAMILY_DRUID:
12400 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12401 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12402 {
12403 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12404 crit_chance += rendAndTear->GetAmount();
12405 break;
12406 }
12407 break;
12409 // Victory Rush
12410 if (spellProto->SpellFamilyFlags[1] & 0x100)
12411 {
12412 // Glyph of Victory Rush
12413 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12414 crit_chance += aurEff->GetAmount();
12415 break;
12416 }
12417 break;
12418 }
12419 }
12420
12421 // 100% critical chance against sitting target
12423 {
12424 return 100.0f;
12425 }
12426 [[fallthrough]];
12428 {
12429 // flat aura mods
12430 if (attackType == RANGED_ATTACK)
12432 else
12434
12435 // reduce crit chance from Rating for players
12436 if (attackType != RANGED_ATTACK)
12437 {
12438 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12439 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12440 }
12441 else
12442 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12443
12444 // Apply crit chance from defence skill
12445 if (caster)
12446 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12447
12448 break;
12449 }
12450 // values overridden in spellmgr for lifebloom and earth shield
12452 default:
12453 return 0.0f;
12454 }
12455
12456 if (caster)
12457 {
12458 crit_chance += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, [caster](AuraEffect const* aurEff)
12459 {
12460 return caster->GetGUID() == aurEff->GetCasterGUID();
12461 });
12462 }
12463
12464 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12465 // xinef: should be calculated at the end
12466 if (!spellProto->IsPositive())
12468
12469 // xinef: can be negative!
12470 return crit_chance;
12471}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2644
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1350
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1321
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1315
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1812
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6183

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition Unit.h:604

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20156{
20157 if (Unit* victim = GetVictim())
20158 {
20159 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20160 {
20161 AttackStop();
20162 if (IsNonMeleeSpellCast(false))
20164
20165 // melee and ranged forced attack cancel
20166 if (IsPlayer())
20168 }
20169 }
20170
20171 AttackerSet const& attackers = getAttackers();
20172 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20173 {
20174 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20175 {
20176 (*itr)->AttackStop();
20177 itr = attackers.begin();
20178 }
20179 else
20180 ++itr;
20181 }
20182
20184
20185 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20186 (*itr)->StopAttackFaction(faction_id);
20187}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20190{
20191 AttackerSet const& attackers = getAttackers();
20192 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20193 {
20194 Unit* attacker = (*itr);
20195 if (!attacker->IsValidAttackTarget(this))
20196 {
20197 attacker->AttackStop();
20198 if (attacker->IsPlayer())
20199 {
20201 }
20202
20203 for (Unit* controlled : attacker->m_Controlled)
20204 {
20205 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
20206 {
20207 controlled->AttackStop();
20208 }
20209 }
20210
20211 itr = attackers.begin();
20212 }
20213 else
20214 {
20215 ++itr;
20216 }
20217 }
20218}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16876{
16878
16879 // not need send any packets if not in world or not moving
16880 if (!IsInWorld())
16881 return;
16882
16883 if (movespline->Finalized())
16884 return;
16885
16886 // Update position now since Stop does not start a new movement that can be updated later
16887 if (movespline->HasStarted())
16889
16890 Movement::MoveSplineInit init(this);
16891 init.Stop();
16892}
bool HasStarted() const
Definition MoveSpline.h:129
void UpdateSplinePosition()
Definition Unit.cpp:608

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::Reset(), npc_xt002_boombot::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SendMoveRoot(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_mimiron::UpdateAI(), boss_razorscale::UpdateAI(), boss_thorim_sif::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16915{
16917
16918 // not need send any packets if not in world
16919 if (!IsInWorld())
16920 return;
16921
16922 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16923 Movement::MoveSplineInit init(this);
16924 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16925 init.SetFacing(GetOrientation());
16926 init.Launch();
16927}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_core(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21235{
21236 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21239 Cell::VisitObjects(this, worker, textRange);
21240}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1737
Definition GridNotifiers.h:583

References Cell::VisitObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21287{
21288 if (!sObjectMgr->GetBroadcastText(textId))
21289 {
21290 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21291 return;
21292 }
21293
21294 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21297 Cell::VisitObjects(this, worker, textRange);
21298}
Definition ChatTextBuilder.h:31
uint8 getGender() const
Definition Unit.h:838

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14779{
14780 ASSERT(IsCreature());
14781
14782 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14783 return;
14784
14785 if (!CanHaveThreatList())
14786 return;
14787
14788 Creature* creature = ToCreature();
14789
14790 if (creature->HasReactState(REACT_PASSIVE))
14791 return;
14792
14793 Unit* target = GetVictim();
14794 if (target && target == taunter)
14795 return;
14796
14797 SetInFront(taunter);
14798 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14799
14800 if (creature->IsAIEnabled)
14801 creature->AI()->AttackStart(taunter);
14802
14803 //m_ThreatMgr.tauntApply(taunter);
14804}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20501

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14809{
14810 ASSERT(IsCreature());
14811
14812 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14813 return;
14814
14815 if (!CanHaveThreatList())
14816 return;
14817
14818 Creature* creature = ToCreature();
14819
14820 if (creature->HasReactState(REACT_PASSIVE))
14821 return;
14822
14823 Unit* target = GetVictim();
14824 if (!target || target != taunter)
14825 return;
14826
14828 {
14829 if (creature->IsAIEnabled)
14831 return;
14832 }
14833
14834 target = creature->SelectVictim(); // might have more taunt auras remaining
14835
14836 if (target && target != taunter)
14837 {
14839 SetInFront(target);
14840 if (creature->IsAIEnabled)
14841 creature->AI()->AttackStart(target);
14842 }
14843}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:205
Unit * SelectVictim()
Definition Unit.cpp:14847
bool isThreatListEmpty() const
Definition ThreatMgr.h:228

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21311{
21312 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21313}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
721{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_the_cleansing_on_death_cast_on_master::HandleScript(), spell_gen_whisper_to_controller::HandleScript(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::JustDied(), boss_yoggsaron_influence_tentacle::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::JustSummoned(), npc_frosthound::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::JustSummoned(), npc_algalon_worm_hole::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_ulduar_flames_spread::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::UpdateAI(), npc_ulduar_flash_freeze::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
722{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
720{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16770{
16771 DamageInfo dmgInfo = DamageInfo(damageInfo);
16772 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16773}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16769

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16795{
16796 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16797 {
16798 if (!(*itr)->GetRemoveMode())
16799 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16800 }
16801}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16776{
16777 // prepare data for self trigger
16778 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16779 std::list<AuraApplication*> myAurasTriggeringProc;
16780 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16781
16782 // prepare data for target trigger
16783 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16784 std::list<AuraApplication*> targetAurasTriggeringProc;
16785 if (typeMaskActionTarget)
16786 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16787
16788 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16789
16790 if (typeMaskActionTarget)
16791 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16792}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16739

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11419{
11420 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11421 {
11422 if (!m_SummonSlot[i])
11423 {
11424 continue;
11425 }
11426
11427 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11428 {
11429 if (OldTotem->IsSummon())
11430 {
11431 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11432 {
11433 OldTotem->ToTempSummon()->UnSummon();
11434 }
11435 }
11436 }
11437 }
11438}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 WorldObject::Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1326
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:236
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:105
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3865
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:17181
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20490
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2792
void SendThreatListUpdate()
Definition Unit.cpp:20064
virtual void Update(uint32 diff)
Definition Object.cpp:1044

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllDamageDoneMods()

void Unit::UpdateAllDamageDoneMods ( )
15506{
15507 for (uint8 i = BASE_ATTACK; i < MAX_ATTACK; ++i)
15509}
virtual void UpdateDamageDoneMods(WeaponAttackType attackType, int32 skipEnchantSlot=-1)
Definition Unit.cpp:15475

References BASE_ATTACK, MAX_ATTACK, and UpdateDamageDoneMods().

Referenced by AuraEffect::HandleModDamageDone().

◆ UpdateAllDamagePctDoneMods()

void Unit::UpdateAllDamagePctDoneMods ( )
15550{
15551 for (uint8 i = BASE_ATTACK; i < MAX_ATTACK; ++i)
15553}
void UpdateDamagePctDoneMods(WeaponAttackType attackType)
Definition Unit.cpp:15511

References BASE_ATTACK, MAX_ATTACK, and UpdateDamagePctDoneMods().

Referenced by AuraEffect::HandleModDamagePercentDone().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17423{
17424 if (slot >= MAX_AURAS) // slot not found, return
17425 return;
17426 if (Player* player = ToPlayer())
17427 {
17428 if (player->GetGroup())
17429 {
17430 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17431 player->SetAuraUpdateMaskForRaid(slot);
17432 }
17433 }
17434 else if (IsCreature() && IsPet())
17435 {
17436 Pet* pet = ((Pet*)this);
17437 if (pet->isControlled())
17438 {
17439 Unit* owner = GetOwner();
17440 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17441 {
17443 pet->SetAuraUpdateMaskForRaid(slot);
17444 }
17445 }
17446 }
17447}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition Group.h:109
#define MAX_AURAS
Definition SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
16015{
16016 if (IsPlayer())
16017 return;
16018
16019 if (i_disabledAI) // disabled AI must be primary AI
16020 {
16021 if (!IsCharmed())
16022 {
16023 delete i_AI;
16025 i_disabledAI = nullptr;
16026 }
16027 }
16028 else
16029 {
16030 if (IsCharmed())
16031 {
16033 if (isPossessed() || IsVehicle())
16034 i_AI = new PossessedAI(ToCreature());
16035 else
16036 i_AI = new PetAI(ToCreature());
16037 }
16038 }
16039}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamageDoneMods()

void Unit::UpdateDamageDoneMods ( WeaponAttackType  attackType,
int32  skipEnchantSlot = -1 
)
virtual

Reimplemented in Player.

15476{
15477 UnitMods unitMod;
15478 switch (attackType)
15479 {
15480 case BASE_ATTACK:
15481 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
15482 break;
15483 case OFF_ATTACK:
15484 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
15485 break;
15486 case RANGED_ATTACK:
15487 unitMod = UNIT_MOD_DAMAGE_RANGED;
15488 break;
15489 default:
15490 ABORT();
15491 break;
15492 }
15493
15494 float amount = GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_DONE, [&](AuraEffect const* aurEff) -> bool
15495 {
15496 if (!(aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL))
15497 return false;
15498
15499 return CheckAttackFitToAuraRequirement(attackType, aurEff);
15500 });
15501
15502 SetStatFlatModifier(unitMod, TOTAL_VALUE, amount);
15503}
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:174
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:172
virtual bool CheckAttackFitToAuraRequirement(WeaponAttackType, AuraEffect const *) const
Definition Unit.h:1072
void SetStatFlatModifier(UnitMods unitMod, UnitModifierFlatType modifierType, float val)
Definition Unit.cpp:15372

References ABORT, BASE_ATTACK, CheckAttackFitToAuraRequirement(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), OFF_ATTACK, RANGED_ATTACK, SetStatFlatModifier(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

Referenced by UpdateAllDamageDoneMods(), and Player::UpdateDamageDoneMods().

◆ UpdateDamagePctDoneMods()

void Unit::UpdateDamagePctDoneMods ( WeaponAttackType  attackType)
15512{
15513 float factor;
15514 UnitMods unitMod;
15515 switch (attackType)
15516 {
15517 case BASE_ATTACK:
15518 factor = 1.0f;
15519 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
15520 break;
15521 case OFF_ATTACK:
15522 // off hand has 50% penalty
15523 factor = 0.5f;
15524 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
15525 break;
15526 case RANGED_ATTACK:
15527 factor = 1.0f;
15528 unitMod = UNIT_MOD_DAMAGE_RANGED;
15529 break;
15530 default:
15531 ABORT();
15532 break;
15533 }
15534
15535 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [attackType, this](AuraEffect const* aurEff) -> bool
15536 {
15537 if (!(aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL))
15538 return false;
15539
15540 return CheckAttackFitToAuraRequirement(attackType, aurEff);
15541 });
15542
15543 if (attackType == OFF_ATTACK)
15544 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT, std::bind(&Unit::CheckAttackFitToAuraRequirement, this, attackType, std::placeholders::_1));
15545
15546 SetStatPctModifier(unitMod, TOTAL_PCT, factor);
15547}
@ SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT
Definition SpellAuraDefines.h:185
void SetStatPctModifier(UnitMods unitMod, UnitModifierPctType modifierType, float val)
Definition Unit.cpp:15381

References ABORT, BASE_ATTACK, CheckAttackFitToAuraRequirement(), AuraEffect::GetMiscValue(), GetTotalAuraMultiplier(), OFF_ATTACK, RANGED_ATTACK, SetStatPctModifier(), SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

Referenced by AuraEffect::HandleModOffhandDamagePercent(), UpdateAllDamagePctDoneMods(), and Player::UpdateWeaponDependentAuras().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:779

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), and UpdateUnitMod().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20058{
20060 if (IsVehicle())
20062}
void RelocatePassengers()
Definition Vehicle.cpp:517

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
769{
770 m_interruptMask = 0;
771 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
772 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
773
775 if (spell->getState() == SPELL_STATE_CASTING)
776 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
777}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

20050{
20051 SetOrientation(orientation);
20052 if (IsVehicle())
20054}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

20012{
20013 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20014 return false;
20015
20016 float old_orientation = GetOrientation();
20017 float current_z = GetPositionZ();
20018 bool turn = (old_orientation != orientation);
20019 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20020
20021 if (!GetVehicle())
20022 {
20023 uint32 mask = 0;
20024 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20025 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20026 if (mask)
20028 }
20029
20030 if (relocated)
20031 {
20032 if (IsPlayer())
20033 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20034 else
20035 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20036 }
20037 else if (turn)
20038 {
20039 UpdateOrientation(orientation);
20040
20041 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
20043 }
20044
20045 return (relocated || turn);
20046}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:784
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:806
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:20049
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMoverRelocation(), boss_flame_leviathan::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_core(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_escortAI::SetNextWaypoint(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17182{
17183 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17184 {
17185 ReactiveType reactive = ReactiveType(i);
17186
17187 if (!m_reactiveTimer[reactive])
17188 continue;
17189
17190 if (m_reactiveTimer[reactive] <= p_time)
17191 {
17192 m_reactiveTimer[reactive] = 0;
17193
17194 switch (reactive)
17195 {
17196 case REACTIVE_DEFENSE:
17199 break;
17203 break;
17204 case REACTIVE_OVERPOWER:
17206 {
17208 }
17209 break;
17211 if (IsHunterPet())
17213 break;
17214 default:
17215 break;
17216 }
17217 }
17218 else
17219 {
17220 m_reactiveTimer[reactive] -= p_time;
17221 }
17222 }
17223}
ReactiveType
Definition Unit.h:607

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistanceBuffModsMod()

void Unit::UpdateResistanceBuffModsMod ( SpellSchools  school)
6274{
6275 float modPos = 0.0f;
6276 float modNeg = 0.0f;
6277
6278 // these auras are always positive
6280 modPos += GetTotalAuraModifier(SPELL_AURA_MOD_RESISTANCE, [school](AuraEffect const* aurEff) -> bool
6281 {
6282 if ((aurEff->GetMiscValue() & (1 << school)) && aurEff->GetAmount() > 0)
6283 return true;
6284 return false;
6285 });
6286
6287 modNeg = GetTotalAuraModifier(SPELL_AURA_MOD_RESISTANCE, [school](AuraEffect const* aurEff) -> bool
6288 {
6289 if ((aurEff->GetMiscValue() & (1 << school)) && aurEff->GetAmount() < 0)
6290 return true;
6291 return false;
6292 });
6293
6295 modPos *= factor;
6296 modNeg *= factor;
6297
6300}
@ SPELL_AURA_MOD_RESISTANCE
Definition SpellAuraDefines.h:85
@ SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
Definition SpellAuraDefines.h:206
@ SPELL_AURA_MOD_RESISTANCE_PCT
Definition SpellAuraDefines.h:164

References AsUnderlyingType(), AuraEffect::GetAmount(), GetMaxPositiveAuraModifierByMiscMask(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), Object::SetFloatValue(), SPELL_AURA_MOD_RESISTANCE, SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE, SPELL_AURA_MOD_RESISTANCE_PCT, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), and AuraEffect::HandleModResistancePercent().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by UpdateAllResistances(), and UpdateUnitMod().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14424{
14425 int32 main_speed_mod = 0;
14426 float stack_bonus = 1.0f;
14427 float non_stack_bonus = 1.0f;
14428
14429 switch (mtype)
14430 {
14431 // Only apply debuffs
14432 case MOVE_FLIGHT_BACK:
14433 case MOVE_RUN_BACK:
14434 case MOVE_SWIM_BACK:
14435 case MOVE_WALK:
14436 break;
14437 case MOVE_RUN:
14438 {
14439 if (IsMounted()) // Use on mount auras
14440 {
14444 }
14445 else
14446 {
14450 }
14451 break;
14452 }
14453 case MOVE_SWIM:
14454 {
14455 // xinef: check for forced_speed_mod of sea turtle
14457 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14458 {
14459 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14460 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14461 {
14462 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14463 return;
14464 }
14465 else if (
14466 // case: increase speed
14467 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14468 // case: decrease speed
14469 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14470 )
14471 {
14472 main_speed_mod = (*itr)->GetAmount();
14473 }
14474 }
14475 break;
14476 }
14477 case MOVE_FLIGHT:
14478 {
14479 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14480 {
14483
14484 // for some spells this mod is applied on vehicle owner
14485 int32 owner_speed_mod = 0;
14486
14487 if (Unit* owner = GetCharmer())
14488 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14489
14490 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14491 }
14492 else if (IsMounted())
14493 {
14497 }
14498 else // Use not mount (shapeshift for example) auras (should stack)
14499 {
14503 }
14504
14505 // Update speed for vehicle if available
14506 if (IsPlayer() && GetVehicle())
14508 break;
14509 }
14510 default:
14511 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14512 return;
14513 }
14514
14515 // now we ready for speed calculation
14516 float speed = std::max(non_stack_bonus, stack_bonus);
14517 if (main_speed_mod)
14518 AddPct(speed, main_speed_mod);
14519
14520 switch (mtype)
14521 {
14522 case MOVE_RUN:
14523 case MOVE_SWIM:
14524 case MOVE_FLIGHT:
14525 {
14526 // Set creature speed rate
14527 if (IsCreature())
14528 {
14529 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14530 {
14531 // contant value for player pets
14532 speed *= 1.15f;
14533 }
14534 else
14535 {
14536 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14537 }
14538 }
14539
14540 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14543 {
14544 if (Creature* creature = ToCreature())
14545 {
14546 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14547 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14548 break;
14549 }
14550
14551 // Use speed from aura
14552 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14553 if (speed > max_speed)
14554 speed = max_speed;
14555 }
14556 break;
14557 }
14558 default:
14559 break;
14560 }
14561
14562 int32 slowFromHealth = 0;
14563 Creature* creature = ToCreature();
14564 // ignore pets, player owned vehicles, and mobs immune to snare
14565 if (creature
14566 && !IsPet()
14567 && !(IsControlledByPlayer() && IsVehicle())
14569 && !(creature->IsDungeonBoss()))
14570 {
14571 // 1.6% for each % under 30.
14572 // use min(0, health-30) so that we don't boost mobs above 30.
14573 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14574 }
14575
14576 if (slowFromHealth)
14577 {
14578 AddPct(speed, slowFromHealth);
14579 }
14580
14581 // Apply strongest slow aura mod to speed
14583 if (slow)
14584 AddPct(speed, slow);
14585
14586 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14587 {
14588 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14589 float min_speed = base_speed * (minSpeedMod / 100.0f);
14590 if (speed < min_speed)
14591 speed = min_speed;
14592 }
14593
14594 SetSpeed(mtype, speed, forced);
14595}
@ MECHANIC_DAZE
Definition SharedDefines.h:1363
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:360
@ MOVE_SWIM_BACK
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:355
@ MOVE_WALK
Definition UnitDefines.h:353
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14602
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
598 if (movespline->HasAnimation() && IsCreature() && IsAlive())
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
AnimTier
Definition MotionMaster.h:99
uint8 GetAnimationType() const
Definition MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:124
Definition Unit.cpp:556
void SetAnimTier(AnimTier animTier)
Definition Unit.cpp:15296

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, SetAnimTier(), UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer() || IsPet())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3115
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:127
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:19025
Position pos
Definition Object.h:308
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), IsPet(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStatBuffMod()

void Unit::UpdateStatBuffMod ( Stats  stat)
6303{
6304 float modPos = 0.0f;
6305 float modNeg = 0.0f;
6306 float factor = 0.0f;
6307
6308 UnitMods const unitMod = static_cast<UnitMods>(UNIT_MOD_STAT_START + AsUnderlyingType(stat));
6309
6310 // includes value from items and enchantments
6311 float modValue = GetFlatModifierValue(unitMod, BASE_VALUE);
6312 if (modValue > 0.f)
6313 modPos += modValue;
6314 else
6315 modNeg += modValue;
6316
6317 modPos += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
6318 {
6319 if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() > 0)
6320 return true;
6321 return false;
6322 });
6323
6324 modNeg += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
6325 {
6326 if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() < 0)
6327 return true;
6328 return false;
6329 });
6330
6331 factor = GetTotalAuraMultiplier(SPELL_AURA_MOD_PERCENT_STAT, [stat](AuraEffect const* aurEff) -> bool
6332 {
6333 if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
6334 return true;
6335 return false;
6336 });
6337
6338 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, [stat](AuraEffect const* aurEff) -> bool
6339 {
6340 if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
6341 return true;
6342 return false;
6343 });
6344
6345 modPos *= factor;
6346 modNeg *= factor;
6347
6350}
@ SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
Definition SpellAuraDefines.h:200
@ SPELL_AURA_MOD_STAT
Definition SpellAuraDefines.h:92
@ SPELL_AURA_MOD_PERCENT_STAT
Definition SpellAuraDefines.h:143

References AsUnderlyingType(), BASE_VALUE, AuraEffect::GetAmount(), GetFlatModifierValue(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), Object::SetFloatValue(), SPELL_AURA_MOD_PERCENT_STAT, SPELL_AURA_MOD_STAT, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_POSSTAT0, and UNIT_MOD_STAT_START.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), AuraEffect::HandleAuraModStat(), and AuraEffect::HandleModTotalPercentStat().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateUnitMod()

void Unit::UpdateUnitMod ( UnitMods  unitMod)
15413{
15414 if (!CanModifyStats())
15415 return;
15416
15417 switch (unitMod)
15418 {
15425 break;
15426
15427 case UNIT_MOD_ARMOR:
15428 UpdateArmor();
15429 break;
15430 case UNIT_MOD_HEALTH:
15432 break;
15433
15434 case UNIT_MOD_MANA:
15435 case UNIT_MOD_RAGE:
15436 case UNIT_MOD_FOCUS:
15437 case UNIT_MOD_ENERGY:
15438 case UNIT_MOD_HAPPINESS:
15439 case UNIT_MOD_RUNE:
15442 break;
15443
15451 break;
15452
15455 break;
15458 break;
15459
15462 break;
15465 break;
15468 break;
15469
15470 default:
15471 break;
15472 }
15473}
@ UNIT_MOD_ARMOR
Definition Unit.h:163
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:170
@ UNIT_MOD_HEALTH
Definition Unit.h:155
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:171
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15589
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15621
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15650
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition Unit.h:1083
virtual void UpdateMaxHealth()=0

References BASE_ATTACK, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), OFF_ATTACK, RANGED_ATTACK, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by ApplyStatPctModifier(), HandleStatFlatModifier(), SetStatFlatModifier(), and SetStatPctModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21258{
21259 if (!target)
21260 {
21261 return;
21262 }
21263
21265 WorldPacket data;
21266 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21267 target->SendDirectMessage(&data);
21268}
LocaleConstant
Definition Common.h:117
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3407
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3434
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:579

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21316{
21317 if (!target)
21318 {
21319 return;
21320 }
21321
21322 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21323 if (!bct)
21324 {
21325 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21326 return;
21327 }
21328
21330 WorldPacket data;
21331 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21332 target->SendDirectMessage(&data);
21333}
Definition ObjectMgr.h:435

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21306{
21307 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21308}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _dualWieldMode

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraFlatModifiersGroup

float Unit::m_auraFlatModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
protected

◆ m_auraPctModifiersGroup

float Unit::m_auraPctModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
protected

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

◆ m_scAuras

AuraList Unit::m_scAuras
protected

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet

The documentation for this class was generated from the following files: